Proverò a spiegare i miei equivoci con il seguente esempio.
Non ho capito i fondamenti di Bitmap Heap Scan Node
. Considera la query SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
il cui piano è questo:
Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
-> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
-> Bitmap Index Scan on ix_cust_username (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
Index Cond: ((username)::text < 'user100'::text)
-> Bitmap Index Scan on customers_pkey (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
Index Cond: (customerid < 1000)
La mia comprensione di questo nodo :
Come spiegato qui , la bitmap heap scan
tabella si blocca in ordine sequenziale, quindi non produce un overhead di accesso casuale alla tabella che accade semplicemente Index Scan
.
Dopo che Index Scan
è stato fatto, PostgreSQL non sa come recuperare le righe in modo ottimale, per evitare inutili heap blocks reads
(o hits
se c'è una cache calda). Quindi per capirlo genera la struttura ( Bitmap Index Scan
) chiamata bitmap
che nel mio caso viene generata generando due bitmap degli indici ed eseguendo BITWISE AND
. Poiché la bitmap è stata generata, ora può leggere la tabella in modo ottimale in un ordine sequenziale, evitando inutili heap I/O-operations
.
Questo è il luogo in cui arrivano molte domande.
DOMANDA: Abbiamo solo una bitmap. Come fa PostgreSQL a sapere con una bitmap qualcosa sull'ordine fisico delle righe? O genera la bitmap in modo che qualsiasi elemento di essa possa essere mappato facilmente sul puntatore a una pagina? Se è così, questo spiega tutto, ma è solo una mia ipotesi.
Quindi, possiamo semplicemente dire che bitmap heap scan -> bitmap index scan
è come una scansione sequenziale ma solo della parte appropriata della tabella?
001001010101011010101
. O in realtà non importa e tutto ciò che dobbiamo sapere è solo che può trovare un blocco dalla sua bitmap in modo abbastanza veloce ...?