Questa pagina descrive Calíope 1.7, la versione che sto costruendo adesso. La 1.6 è sull'App Store per Mac, iPad, iPhone, Apple Watch, Apple TV e Apple Vision Pro. Il changelog dice in quale versione è arrivata ogni funzione.

Aggiunge a ogni argomento un pulsante «Apri in Calíope». Funziona solo con l'app installata.

Query lente del server

Il registro delle query lente

Quello che il server ha annotato da sé sulle query che hanno superato la sua soglia, per tutti i suoi client.

Dove si trova: Workspace › Strumenti › Query lente

Questo è ciò che il server ha annotato da sé: le query che hanno superato la sua soglia, di tutti i suoi client e non solo di Calíope. Il registro delle query dell'app è un'altra cosa —quello che hai eseguito da qui— e ha uno strumento tutto suo.

La barra offre fino a tre viste, e quali esistono lo decide il server: Impostazioni, sempre; Voci, una riga per esecuzione, solo se il motore conserva le singole esecuzioni e permette a un client di leggerle; Per istruzione, il riepilogo raggruppato per forma della query, solo se il motore lo pubblica. Una vista che il server non può riempire non viene disegnata in grigio: non viene disegnata.

MySQLMariaDBAurora

La famiglia MySQL dà entrambe le cose: mysql.slow_log conserva le esecuzioni —con la loro ora, il loro utente e il testo letterale— e performance_schema conserva il riepilogo per forma.

PostgreSQL

PostgreSQL non conserva esecuzioni leggibili da un client: il suo log va in un file della macchina del server. Quello che pubblica è l'aggregato, con pg_stat_statements, quindi qui vedrai Per istruzione e non Voci.

SQL Server

SQL Server non ha un registro delle query lente: né soglia né esecuzioni registrate. Quello che tiene, sempre e senza accendere nulla, è il conteggio di ogni piano nella sua cache, ed è ciò che vedrai in Per istruzione. Voci non compare.

Per vedere una riga intera —il testo completo e tutto ciò che il server ha annotato— fai doppio clic su di essa sul Mac o toccala su iPad. Dalla sua scheda la query si copia o si porta nell'editor.

Il selettore di destra dice quante righe vengono chieste: cinquanta per vedere cosa sta succedendo ora, mille per rivedere la giornata intera. L'aggiornamento automatico rilegge ogni dieci secondi, e la barra dice a che ora è stato letto quello che stai guardando.

Oracle

Oracle non ha un registro delle query lente: né soglia del server né esecuzioni registrate una per una. Quello che si legge è la cache delle istruzioni (V$SQL), che tiene sempre i numeri di ogni istruzione finché ci resta. Voci mostra una riga per istruzione nella sua esecuzione media —tempo, CPU, letture e righe divisi per il numero di esecuzioni, che sta accanto— e Per istruzione, il riepilogo raggruppato per forma. Non è una cronologia: un'istruzione che esce dalla cache scompare con i suoi numeri, e un riavvio la svuota. Le query interne di SYS e SYSTEM non compaiono, tranne le tue se accedi con uno di quegli account. Leggere V$SQL richiede un privilegio di dizionario (SELECT_CATALOG_ROLE o SELECT ANY DICTIONARY); senza, la schermata mostra l'errore del server. AWR e le viste DBA_HIST_* non vengono interrogati: richiedono un pacchetto a pagamento di Oracle.

ClickHouse

ClickHouse dà entrambe le cose da system.query_log: le esecuzioni, lette subito dopo un SYSTEM FLUSH LOGS perché ciò che è appena stato eseguito ci sia già, e il riepilogo per forma. Le esecuzioni includono quelle fallite, con il loro errore in una colonna a parte, e riportano i byte letti e la memoria dopo il tempo; l'ora è quella dell'orologio del server. Nascondi quelle di Calíope, attiva per impostazione predefinita, nasconde ciò che Calíope interroga per conto suo, mai ciò che hai scritto nell'editor.

Apple Vision Pro: come sull'iPad: guarda la riga e pizzica per aprirla.

Parole chiave: query lente, slow query log, prestazioni, server, soglia, registro

Impostazioni, motore per motore

Accendere il registro, spostare la soglia e scegliere dove scrive — dove il server lo consenta da qui.

Dove si trova: Query lente › Impostazioni

Le schede in alto dicono quello che il server risponde in questo momento: se sta registrando, con quale soglia e dove scrive. Sotto compare una di due cose: i controlli per cambiarlo, o una nota che dice dove si cambia davvero. Mai i controlli spenti, che non distinguono «qui no» da «questo è rotto».

La soglia si digita o si sposta con i pulsanti meno e più, e si invia con Applica. Una soglia negativa viene rifiutata qui: nessuna query dura meno di niente, e il server la taglierebbe a zero senza dire nulla — con il risultato che ogni query diventerebbe lenta e il registro crescerebbe senza freni.

MySQLMariaDBAurora

La soglia è in secondi (long_query_time), e la destinazione si sceglie tra la tabella mysql.slow_log, il file del server o entrambi (log_output). Solo quello che va nella tabella si può leggere da un client.

Due cose che sorprendono: una modifica fatta da qui non sopravvive a un riavvio del server —per questo va nel suo file di configurazione— e non raggiunge le connessioni già aperte, nemmeno quella di Calíope: le sessioni vive continuano a misurare con il valore precedente finché non vengono riciclate.

Aurora

Su Amazon Aurora queste impostazioni non vivono nel server ma nel gruppo di parametri del cluster, quindi qui vedrai la nota invece dei controlli. Svuotare il registro si può: lo fa il server stesso con mysql.rds_rotate_slow_log.

PostgreSQL

La soglia è in millisecondi (log_min_duration_statement), e una modifica fatta da qui persiste: si scrive con ALTER SYSTEM e il server ricarica la sua configurazione.

Ma ci sono origini che vincono senza dirlo. Se il valore viene dalla riga di comando con cui il server è partito, o da un'impostazione di questo database, di questo ruolo o di questa sessione, la scrittura viene accettata, il file resta con il valore nuovo e quello in vigore è ancora il vecchio. Per questo la prima variabile dell'elenco in fondo è l'origine della soglia: è quella che dice dove va cambiata. Quando l'origine è una di quelle, qui vedrai la nota e non i controlli.

La destinazione non si sceglie: PostgreSQL scrive sempre nel suo log, che è un file della macchina del server.

SQL Server

In SQL Server non c'è nulla da regolare: la cache dei piani tiene il conto sempre, e non ha né soglia né destinazione da scegliere. Per questo la scheda della soglia non compare e vedrai la nota al posto dei controlli. Quello che si legge vive nella memoria del server: si perde al riavvio, e un piano che esce dalla cache si porta via i suoi numeri. Con optimize for ad hoc workloads acceso, una query isolata entra solo alla seconda esecuzione.

L'elenco finale sono le variabili che questo server pubblica intorno al registro, con il nome che dà loro. Sono informative: si cambiano dove si cambiano le loro impostazioni, non qui.

Oracle

In Oracle la soglia è di Calíope, non del server: si applica alla lettura, all'esecuzione media di ogni istruzione, e viene salvata in questo profilo. Cambiarla non tocca nulla sul server e vale dalla lettura successiva. È in secondi, anche se la cache conta il tempo in microsecondi; se non l'hai cambiata, è un secondo. Non c'è interruttore —la cache non si spegne— né destinazione da scegliere: ciò che si legge vive nella memoria del server.

ClickHouse

Il server tiene la soglia in millisecondi (log_queries_min_query_duration_ms), anche se qui si mostra in secondi, e la destinazione è sempre system.query_log. L'attivazione e la soglia si salvano nel tuo stesso account, con ALTER USER … MODIFY SETTINGS, e valgono per le query di quell'account dalla successiva, non per quelle degli altri. Se l'account è definito nella configurazione del server o non ha ALTER USER, vedrai la nota invece dei controlli. Svuotare il registro è TRUNCATE TABLE system.query_log, per tutto il server.

Parole chiave: soglia, long_query_time, log_min_duration_statement, log_output, ALTER SYSTEM, parameter group

Il riepilogo per istruzione

Raggruppa per forma della query, non per esecuzione: dice cosa sta costando la giornata al server.

Dove si trova: Query lente › Per istruzione

Per istruzione non elenca esecuzioni: raggruppa per la forma della query. I letterali vengono sostituiti da un segnaposto, quindi mille query che differiscono solo nel valore cercato sono una riga, con le sue chiamate, il suo tempo totale e il suo tempo medio. È la risposta a «cosa sta costando la giornata a questo server?», che quasi mai è la query più lenta di tutte.

MySQLMariaDBAurora

Lo pubblica performance_schema, e i letterali escono come ?. Su MariaDB nasce spento: se questa vista dice che non c'è riepilogo, non è che non ci siano query lente — è che performance_schema è su OFF. Non si accende con il server in marcia: va nel suo file di configurazione e bisogna riavviarlo.

PostgreSQL

Lo pubblica pg_stat_statements, e i letterali escono come $1. Servono due cose, entrambe fuori dall'app: la libreria precaricata in shared_preload_libraries, che richiede di riavviare il server, e l'estensione creata in questo database, una volta per database:

CREATE EXTENSION pg_stat_statements;

Se l'estensione è creata e la libreria non è caricata, la vista esiste e non raccoglie niente. Sono due stati diversi, e lo strumento dice quale.

SQL Server

Lo pubblica sys.dm_exec_query_stats, raggruppato per query_hash, che è la forma della query. Il testo che vedi è quello di una delle sue esecuzioni, con i suoi letterali, non una forma con segnaposto. Leggerlo richiede il permesso VIEW SERVER STATE; senza, la vista mostra l'errore del server. Azzerare le statistiche non compare: svuotare questo riepilogo sarebbe DBCC FREEPROCCACHE, che butta i piani di tutto il server, e non si fa da qui.

Il riepilogo è di tutto il server, quindi i privilegi contano: dove il tuo utente non può leggere le query degli altri, il server restituisce la riga senza il testo. Quando succede, qui viene detto con il numero —quante altre forme non puoi leggere—, che è molto diverso da un elenco vuoto.

Azzera statistiche mette quei contatori a zero per tutto il server, non per la tua sessione: riguarda chiunque stia guardando lo stesso riepilogo, e non si può annullare.

Oracle

Viene da V$SQL, raggruppato per FORCE_MATCHING_SIGNATURE: due query che differiscono solo per un letterale sono una riga, e il testo che vedi è quello di una di esse. Le istruzioni senza quella firma —i blocchi PL/SQL, il DDL— si raggruppano per il loro SQL_ID. Il riepilogo non applica la soglia, e il massimo è quello dell'esecuzione media più lenta tra quelle raggruppate: la cache non conserva ogni esecuzione. Azzerare le statistiche non compare, né Svuotare il registro in Voci: entrambi vorrebbero dire svuotare la cache condivisa di tutto il server.

ClickHouse

Viene da system.query_log, raggruppato per normalized_query_hash: due query che differiscono solo per un letterale sono una riga, e il testo che vedi è quello di una di esse. Azzerare le statistiche svuota quella stessa tabella, quindi si porta via anche le esecuzioni, e la conferma lo dice.

Parole chiave: riepilogo, per istruzione, performance_schema, pg_stat_statements, normalizzata, privilegi

Dal registro al Profilatore

Il registro dice quale query è lenta; per sapere perché, la si porta nell'editor e la si profila lì.

Dove si trova: Query lente › clic destro › Porta nell'editor

Il registro dice quale query è lenta. Per sapere perché, la query deve essere eseguita di nuovo, e questa è una tua decisione — non di un elenco che si aggiorna ogni dieci secondi.

Da una riga, con il suo menu contestuale o aprendo la sua scheda, Porta nell'editor lascia la query nell'Editor SQL, in una scheda, senza eseguirla. Lì decidi tu cosa farne.

MySQLMariaDBAuroraClickHouse

Eseguirla e premere Profila per vedere la scomposizione per fasi, o chiedere al motore il suo piano con EXPLAIN visuale.

PostgreSQLSQL ServerOracle

Chiedere al motore il suo piano con EXPLAIN visuale. Profila, la scomposizione per fasi, è della famiglia MySQL e qui non compare nell'editor.

Prima di eseguire quello che porta una riga, ricorda che il testo è quello eseguito da un altro client, con i suoi parametri e contro il database che aveva aperto.

MySQLMariaDBAuroraPostgreSQL

E dal riepilogo per istruzione arriva la forma normalizzata, con segnaposto invece dei valori: devi metterci valori tuoi prima di eseguirla.

SQL ServerClickHouseOracle

Dal riepilogo per istruzione arriva il testo di una delle sue esecuzioni, con i valori di quella: la riga rappresenta tutte quelle della stessa forma.

Parole chiave: profilare, profilatore, editor, explain, piano, porta nell'editor

Svuotare il registro e azzerare il riepilogo

Che cosa elimina ciascun pulsante sul server e con quali motori compare.

Dove si trova: Workspace › Strumenti › Query lente

Due pulsanti eliminano ciò che il server ha registrato, e nessuno dei due si annulla.

- Svuotare il registro, in Voci, elimina le esecuzioni registrate.
- Azzerare le statistiche, in Per istruzione, azzera il riepilogo di tutto il server, non soltanto il tuo.

Entrambe le conferme dicono quante righe se ne andranno, contate sul server prima di chiedere, e passano per la protezione dell’etichetta di ambiente. Compaiono soltanto dove il motore lo consente e la sessione può scrivere.

MySQLMariaDBAurora

Con MySQL, MariaDB e Aurora ci sono entrambi i pulsanti.

PostgreSQL

Con PostgreSQL c’è soltanto l’azzeramento delle statistiche.

ClickHouse

Con ClickHouse ci sono entrambi, e azzerare le statistiche elimina anche le esecuzioni, perché sono la stessa tabella.

SQL ServerOracle

Con SQL Server e Oracle non se ne offre nessuno.

Parole chiave: svuotare, cancellare, azzerare, statistiche, query lente, riepilogo