La bitmap delle pagine viene creata dinamicamente per ogni query. Non viene memorizzato nella cache o riutilizzato e viene eliminato alla fine della scansione dell'indice bitmap.
Non ha senso creare anticipatamente la bitmap della pagina perché il suo contenuto dipende dai predicati della query.
Diciamo che stai cercando x=1 and y=2
. Hai indici b-tree su x
e . PostgreSQL non combina x
e in una bitmap, quindi cerca la bitmap. Esegue la scansione di indice x
per l'indirizzo della pagina di tutte le pagine con x=1
e fa una bitmap in cui le pagine che potrebbero contenere x=1
sono vere. Quindi esegue la scansione di cercando gli indirizzi di pagina in cui potrebbe corrispondere a 2
, creando una bitmap da quella. Poi li usa per trovare pagine in cui sia x=1
sia y=2
potrebbero essere vere. Infine, si esegue la scansione del tavolo la sua auto, leggendo solo le pagine che potrebbero contenere valori candidati, la lettura di ogni pagina e mantenendo solo le righe in cui x=1 and y=2
.
Ora, se si sta cercando qualcosa come un indice bitmap precompilato e memorizzato, esiste una cosa simile in PostgreSQL 9.5: BRIN indexes. Sono pensati per tabelle molto grandi e forniscono un modo per trovare gli intervalli della tabella che possono essere ignorati perché sono noti per non contenere un valore desiderato.
fonte
2015-10-13 12:35:04
Quindi, costruiamo la struttura _dal scratch_ qualsiasi momento abbiamo bisogno di fare 'Bitmap Heap Scan'? –
no, questo è trasparente per l'utente. –