Che cos'è una "scansione heap bitmap" in un piano di query?


113

Voglio conoscere il principio della "scansione dell'heap bitmap", so che questo accade spesso quando eseguo una query con ORla condizione.

Chi può spiegare il principio alla base di una "scansione bitmap heap"?

Risposte:


122

La migliore spiegazione viene da Tom Lane , che è l'autore dell'algoritmo a meno che non mi sbagli. Vedi anche l' articolo di wikipedia .

In breve, è un po 'come una scansione sequenziale. La differenza è che, invece di visitare ogni pagina del disco, un indice bitmap esegue la scansione degli indici AND e OR applicabili insieme e visita solo le pagine del disco di cui ha bisogno.

Questo è diverso da una scansione dell'indice, in cui l'indice viene visitato riga per riga in ordine, il che significa che una pagina del disco può essere visitata più volte.


Ri: la domanda nel tuo commento ... Sì, è esattamente così.

Una scansione dell'indice passerà attraverso le righe una per una, aprendo le pagine del disco ancora e ancora, tutte le volte che sarà necessario (alcune rimarranno ovviamente in memoria, ma ottieni il punto).

Una scansione dell'indice bitmap aprirà in sequenza un breve elenco di pagine del disco e acquisirà ogni riga applicabile in ciascuna di esse (da qui il cosiddetto ricontrollo cond che vedi nei piani di query).

Nota, per inciso, in che modo il raggruppamento / l'ordine di riga influisce sui costi associati con entrambi i metodi. Se le righe sono ovunque in un ordine casuale, un indice bitmap sarà più economico. (E, infatti, se sono veramente tutto il luogo, una scansione ss sarà più economico, dal momento che un indice di scansione bitmap non è senza un certo overhead.)


Quindi, "Scansione heap bitmap": una pagina non può essere visitata più di una volta! ma "Index Can": una pagina può essere visitata più di una volta, perché l'indice viene visitato riga per riga in ordine.
franchi

Probabilmente è coinvolto il caching quando le pagine vengono visitate più volte: la pagina verrà effettivamente caricata dal disco la prima volta (lento), e un ulteriore accesso raggiungerà la cache in memoria (cache Postgres (veloce) o cache del sistema operativo (più veloce)) .
Matthieu

Inoltre c'è il index-only scanmomento in cui si accede solo alla colonna indicizzata nella query. in questo caso, index-only scannon è necessario accedere ai dati dell'heap (pagina dati): postgresql.org/docs/12/indexes-index-only-scans.html
Alan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.