Apa itu "Pemindaian heap bitmap" dalam rencana kueri?

113

Saya ingin mengetahui prinsip "Bitmap heap scan", saya tahu ini sering terjadi saat saya menjalankan kueri dengan ORkondisi tersebut.

Siapa yang dapat menjelaskan prinsip di balik "Pemindaian heap bitmap"?

franc
sumber

Jawaban:

122

Penjelasan terbaik datang dari Tom Lane , yang merupakan penulis algoritme kecuali saya salah. Lihat juga artikel wikipedia .

Singkatnya, ini seperti pemindaian seq. Perbedaannya adalah, daripada mengunjungi setiap halaman diska, indeks bitmap memindai indeks-indeks ANDs dan OR yang berlaku bersama-sama, dan hanya mengunjungi halaman disk yang diperlukan.

Ini berbeda dari pemindaian indeks, di mana indeks dikunjungi baris demi baris secara berurutan - artinya halaman disk dapat dikunjungi beberapa kali.


Re: pertanyaan dalam komentar Anda ... Ya, itu saja.

Pemindaian indeks akan melewati baris satu per satu, membuka halaman disk berulang kali, sebanyak yang diperlukan (beberapa tentu saja akan tetap ada di memori, tetapi Anda mengerti maksudnya).

Pemindaian indeks bitmap secara berurutan akan membuka daftar pendek halaman disk, dan mengambil setiap baris yang berlaku di masing-masing (karenanya disebut kondisi pemeriksaan ulang yang Anda lihat di rencana kueri).

Perhatikan, sebagai tambahan, bagaimana pengelompokan / urutan baris memengaruhi biaya terkait dengan metode mana pun. Jika baris berada di semua tempat dalam urutan acak, indeks bitmap akan lebih murah. (Dan, pada kenyataannya, jika mereka benar-benar semua tempat, scan seq akan termurah, karena scan indeks bitmap bukan tanpa beberapa overhead.)

Denis de Bernardy
sumber
Jadi, "Pemindaian heap bitmap": Halaman tidak dapat dikunjungi lebih dari satu kali! tetapi "Indeks Dapat": Sebuah halaman dapat dikunjungi lebih dari satu kali, karena indeks dikunjungi baris demi baris secara berurutan.
franc
Mungkin ada cache yang terlibat ketika halaman dikunjungi beberapa kali: halaman sebenarnya akan dimuat dari disk untuk pertama kalinya (lambat), dan akses lebih lanjut akan mengenai cache di memori (cache Postgres (cepat) atau cache OS (lebih cepat)) .
Matthieu
Juga ada index-only scansaat hanya kolom yang diindeks diakses dalam kueri. dalam hal ini, index-only scantidak perlu mengakses data heap (halaman data): postgresql.org/docs/12/indexes-index-only-scans.html
Alan