Saya akan mencoba menjelaskan kesalahpahaman saya dengan contoh berikut.
Saya tidak mengerti dasar - dasarBitmap Heap Scan Node
. Pertimbangkan kueri SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
rencananya:
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)
Pemahaman saya tentang simpul ini :
Seperti yang dijelaskan di sana , bitmap heap scan
tabel membaca memblokir secara berurutan, sehingga tidak menghasilkan overhead tabel acak yang terjadi hanya sebagai melakukan Index Scan
.
Setelah Index Scan
selesai, PostgreSQL tidak tahu cara mengambil baris secara optimal, untuk menghindari yang tidak perlu heap blocks reads
(atau hits
jika ada cache panas). Jadi untuk mencari tahu itu menghasilkan struktur ( Bitmap Index Scan
) yang disebut bitmap
dalam kasus saya sedang dihasilkan dengan menghasilkan dua bitmap dari indeks dan melakukan BITWISE AND
. Karena bitmap telah dihasilkan sekarang dapat membaca tabel secara optimal dalam urutan berurutan, menghindari yang tidak perlu heap I/O-operations
.
Di situlah banyak pertanyaan datang.
PERTANYAAN: Kami hanya memiliki bitmap. Bagaimana PostgreSQL tahu hanya sedikit bitmap tentang urutan fisik baris? Atau menghasilkan bitmap sehingga elemen apa pun dapat dipetakan ke pointer ke halaman dengan mudah? Jika demikian, itu menjelaskan segalanya, tetapi itu hanya dugaan saya.
Jadi, dapatkah kita katakan secara sederhana bahwa bitmap heap scan -> bitmap index scan
ini seperti pemindaian berurutan tetapi hanya bagian yang sesuai dari tabel?
001001010101011010101
. Atau sebenarnya itu tidak masalah dan yang harus kita ketahui hanyalah ia dapat menemukan blok dengan bitmapnya dengan cara yang cukup cepat ...?