0Pricing
SQL Academy · Lezione

Individuare e correggere le query lente

Utilizzi pg_stat_statements, log_min_duration_statement ed EXPLAIN per trovare le query lente e applicare correzioni mirate.

Individuare e correggere le query lente è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Passaggio 1: trovare le query lente

Non ottimizzi alla cieca. Utilizzi:

  • pg_stat_statements — query principali ordinate per tempo totale
  • log_min_duration_statement — registra le query che superano una soglia
  • pgBadger — report leggibili generati dai log

Configurare pg_stat_statements

Abiliti l'estensione e configuri shared_preload_libraries:

-- postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

-- After restart:
CREATE EXTENSION pg_stat_statements;

Le 10 query più onerose

La query più utile per qualsiasi DBA:

SELECT query,
       calls,
       total_exec_time,
       mean_exec_time,
       rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

Registrare le query lente

Imposti una soglia e legga il log:

-- postgresql.conf
log_min_duration_statement = '500ms'
-- All queries running > 500ms are logged.

Passaggio 2: riprodurre il problema con EXPLAIN ANALYZE

Per ogni query lenta, esegua EXPLAIN ANALYZE in un ambiente rappresentativo, con dati simili a quelli di produzione. Controlli:

  • Il nodo con il valore più alto di actual time
  • La maggiore differenza tra righe stimate ed effettive
  • Se vengono utilizzati gli indici corretti

Correzioni comuni

  • Indice mancante su una colonna usata in WHERE o JOIN
  • Predicato non sargable, con una funzione sulla colonna: aggiunga un indice su espressione oppure riscriva la query
  • Statistiche obsolete: esegua ANALYZE
  • Tipo di dati errato, che causa un cast implicito: corregga il tipo della colonna
  • Condizioni OR: le riscriva come UNION di query con una singola condizione
  • SELECT * recupera troppi dati: restringa la proiezione

Statistiche obsolete

Se le righe stimate differiscono notevolmente da quelle effettive, esegua prima ANALYZE:

ANALYZE orders;
-- Or rely on autovacuum to do it periodically.

Controllo degli indici

Elenchi gli indici di una tabella e le relative dimensioni:

SELECT indexrelname, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE relname = 'orders'
ORDER BY pg_relation_size(indexrelid) DESC;

Indici inutilizzati

Individui gli indici che non vengono mai utilizzati:

SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;
-- Consider dropping them — they slow writes for no read benefit.

Contesa sui lock

A volte una query è "lenta" perché è in attesa di un lock. Controlli pg_stat_activity per verificare wait_event:

SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle';

Schemi di riscrittura delle query

  • Sposti i filtri nella clausola WHERE
  • Sostituisca la sottoquery correlata in SELECT con JOIN + GROUP BY
  • Sostituisca OR con UNION ALL di query indicizzate
  • Utilizzi le funzioni finestra invece dei self-join
  • Materializzi le sottoquery ripetute con CTE, quando il planner è confuso

Iterare

Ottimizzare le prestazioni è un ciclo: misurare → formulare un'ipotesi → modificare → misurare. Non proceda per supposizioni.

Riepilogo

Individui le query lente con pg_stat_statements, le analizzi con EXPLAIN ANALYZE, le corregga con indici, ANALYZE o riscritture, quindi ripeta il ciclo.

Verifica rapida

Quale estensione di PostgreSQL individua le query che consumano più tempo, ordinate per durata totale?

Domande Frequenti

La lezione «Individuare e correggere le query lente» è gratuita?

Sì — il testo completo di «Individuare e correggere le query lente» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Individuare e correggere le query lente»?

Utilizzi pg_stat_statements, log_min_duration_statement ed EXPLAIN per trovare le query lente e applicare correzioni mirate. Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Individuare e correggere le query lente»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Leggere EXPLAIN ed EXPLAIN ANALYZE
  2. Scansioni sequenziali e scansioni tramite indice
  3. Hash Join, Merge Join e Nested Loop
  4. Individuare e correggere le query lente
← Torna a SQL Academy