0Pricing
SQL Academy · Lezione

Scansioni sequenziali e scansioni tramite indice

Capisca quando una scansione sequenziale è sufficiente, quando è necessaria una scansione tramite indice e come decide il planner.

Scansioni sequenziali e scansioni tramite indice è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 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.

Due modi per trovare le righe

Il database dispone di due strategie di base per leggere le righe:

  • Sequential Scan — legge ogni pagina della tabella
  • Index Scan — percorre un indice e recupera le righe corrispondenti

Quando la scansione sequenziale è la scelta giusta

Se deve leggere comunque la maggior parte della tabella, la scansione è più economica che leggere l'indice E recuperare ogni riga corrispondente. In linea di massima: oltre circa il 10–20% delle righe → vince la scansione sequenziale.

Quando vince la scansione con indice

Per le query selettive, che richiedono una piccola frazione delle righe, l'indice è vantaggioso:

EXPLAIN SELECT * FROM users WHERE id = 42;
-- Index Scan using users_pkey  (cost=0.43..8.45 rows=1)

EXPLAIN SELECT * FROM users WHERE active;
-- Seq Scan on users  (cost=0.00..15000.00 rows=950000)
-- (because most users are active)

Index Scan e Index-Only Scan

A volte l'indice contiene da solo tutte le colonne necessarie: non occorre recuperare dati dalla tabella. Questa è la Index-Only Scan:

CREATE INDEX users_email_id_idx ON users(id) INCLUDE (email);

EXPLAIN SELECT email FROM users WHERE id = 42;
-- Index Only Scan using users_email_id_idx

Bitmap Index Scan

Per una selettività intermedia, PostgreSQL può creare una bitmap delle righe corrispondenti e poi recuperarle in ordine fisico, più rapidamente rispetto all'I/O casuale:

EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
--   Recheck Cond: (status = 'pending')
--   -> Bitmap Index Scan on orders_status_idx

Perché il planner sceglie Seq Scan

Motivi comuni:

  • Non esiste un indice sulla colonna filtrata
  • L'indice non può essere utilizzato (una funzione sulla colonna, clausole OR, tipi non corrispondenti)
  • Il numero di righe previsto è troppo alto perché l'indice sia conveniente
  • Le statistiche sono obsolete e il planner valuta erroneamente la selettività

Forzare l'uso di un indice con cautela

Non è possibile fornire direttamente suggerimenti a PostgreSQL. In alternativa:

  • Esegua ANALYZE per aggiornare le statistiche
  • Aggiunga l'indice corretto
  • Imposti i parametri di sessione: SET enable_seqscan = off; per la diagnosi, non in produzione

Predicati indicizzabili

Perché un indice sia utile, la clausola WHERE deve essere "sargable", cioè deve confrontare direttamente la colonna indicizzata:

-- GOOD:
WHERE created_at >= '2024-01-01'

-- BAD (function on the column):
WHERE date_trunc('day', created_at) = '2024-01-01'

-- BAD (cast):
WHERE created_at::DATE = '2024-01-01'

-- FIX: add a functional index, or rewrite with range.

Ordine in un indice composto

Un indice su (a, b) è utile per le query su a da solo e su a AND b, ma non su b da solo.

Le dimensioni dell'indice contano

Un indice B-tree ristretto con chiavi utilizzate frequentemente può rimanere interamente in memoria; un indice ampio potrebbe non riuscirci. Gli indici più piccoli sono più veloci.

Verificare il piano

Dopo aver aggiunto un indice, esegua EXPLAIN ANALYZE per confermare che il planner lo utilizzi effettivamente. In caso contrario, analizzi il problema.

Riepilogo

La scelta tra scansione sequenziale e scansione con indice dipende dalla selettività.

  • Filtro selettivo → scansione con indice
  • La maggior parte della tabella → scansione sequenziale
  • Scansione bitmap per i casi intermedi
  • Presti attenzione alla sargability

Verifica rapida

Perché PostgreSQL potrebbe scegliere una scansione sequenziale invece di un indice esistente?

Domande Frequenti

La lezione «Scansioni sequenziali e scansioni tramite indice» è gratuita?

Sì — il testo completo di «Scansioni sequenziali e scansioni tramite indice» è 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 «Scansioni sequenziali e scansioni tramite indice»?

Capisca quando una scansione sequenziale è sufficiente, quando è necessaria una scansione tramite indice e come decide il planner. 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 2 di 4.

Quanto tempo richiede la lezione «Scansioni sequenziali e scansioni tramite indice»?

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