SQL Academy · Lezione

Scansioni solo indice e Visibility Map

Abiliti le scansioni solo indice coprendo le query e mantenendo aggiornata la visibility map.

Lezione 4 di 414 passaggi

Scansioni solo indice e Visibility Map è 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.

Che cos'è un Index-Only Scan?

Normalmente, una ricerca nell'indice restituisce gli identificatori delle righe (TID) e deve accedere alla tabella per leggere la riga effettiva. Index-Only Scan risponde alla query utilizzando soltanto l'indice, senza accedere all'heap. È molto più veloce.

Condizioni

Un Index-Only Scan richiede:

  • Tutte le colonne restituite da SELECT devono essere presenti nell'indice
  • La pagina della riga deve essere contrassegnata come «all visible» nella visibility map

Visibility Map

Una bitmap per ogni pagina della tabella: un bit impostato indica che «tutte le righe di questa pagina sono visibili a tutte le transazioni». VACUUM la mantiene aggiornata. Senza di essa, PostgreSQL deve accedere all'heap per verificare la visibilità.

Rendere una query Index-Only

Includa tutte le colonne necessarie:

-- Query:
SELECT id, email FROM users WHERE id = 42;

-- Without an index on (id, email), only an Index Scan that visits the heap is possible.
-- With this:
CREATE INDEX users_id_email_idx ON users (id, email);
-- Or better:
CREATE INDEX users_id_email_idx ON users (id) INCLUDE (email);
-- The query can be index-only.

INCLUDE

Indice di copertura con colonne non chiave (PG 11+). La colonna viene memorizzata nelle pagine foglia, ma non viene utilizzata per l'ordinamento: non incide sul costo degli inserimenti:

CREATE INDEX users_id_idx ON users(id) INCLUDE (email, full_name);

SELECT id, email, full_name FROM users WHERE id = 42;
-- Index-only scan if visibility map allows.

Perché potrebbe comunque accedere all'heap

Dopo molte scritture, la visibility map potrebbe essere obsoleta. Esegua VACUUM (senza FULL) per aggiornarla.

VACUUM (VERBOSE) users;
-- "scanned X pages, X of which are visible"
-- More visible pages = more Index-Only Scans possible.

Verifica degli Index-Only Scan

EXPLAIN lo mostra:

EXPLAIN ANALYZE
SELECT id, email FROM users WHERE id = 42;
--  Index Only Scan using users_id_email_idx on users
--    Index Cond: (id = 42)
--    Heap Fetches: 0       ← key number

Cosa indicano gli Heap Fetches

«Heap Fetches: 0» significa che tutti i dati provengono dall'indice: è la situazione ideale. «Heap Fetches: N» significa che per N righe è stato necessario accedere all'heap (il bit della visibility map non era impostato). Dopo l'esecuzione di autovacuum, Heap Fetches in genere diminuisce.

Quando usare INCLUDE anziché un indice composito

  • Utilizzi INCLUDE per le colonne che vengono solo restituite da SELECT, non usate per filtrare o ordinare
  • Utilizzi un indice composito quando filtra o ordina anche in base alla colonna

INCLUDE mantiene l'indice più compatto e rende più rapide le scritture.

Il bloat degli indici penalizza gli Index-Only Scan

Gli indici con bloat hanno più pagine, quindi anche gli Index-Only Scan devono leggerne di più. Mantenga gli indici sottoposti a vacuum e li ricrei quando il bloat diventa elevato.

Non includa tutto

L'aggiunta di troppe colonne a un indice rallenta le scritture e rende l'indice enorme. Includa solo i percorsi di lettura più utilizzati.

Viste materializzate come copertura

Se desidera una velocità di lettura estrema per un report specifico, una vista materializzata con un indice è essenzialmente un «indice di copertura» con colonne calcolate arbitrarie.

Riepilogo

Index-Only Scan = il percorso di lettura più veloce.

  • Tutte le colonne selezionate devono essere presenti nell'indice
  • INCLUDE aggiunge colonne non chiave in modo economico
  • La visibility map deve indicare «all visible»: VACUUM la mantiene aggiornata
  • In EXPLAIN, l'obiettivo è Heap Fetches: 0

Verifica rapida

In EXPLAIN vede Heap Fetches: 100,000 nonostante un nodo Index Only Scan. Qual è la correzione tipica?

Gratis per iniziare

Impara SQL con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
46
Lezioni
183

Domande Frequenti

La lezione «Scansioni solo indice e Visibility Map» è gratuita?

Sì — il testo completo di «Scansioni solo indice e Visibility Map» è 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 solo indice e Visibility Map»?

Abiliti le scansioni solo indice coprendo le query e mantenendo aggiornata la visibility map. 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 «Scansioni solo indice e Visibility Map»?

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. MVCC e cause del bloat
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE e pg_statistic
  4. Scansioni solo indice e Visibility Map
← Torna a SQL Academy