ฉันจะพยายามอธิบายความเข้าใจที่คลาดเคลื่อนของฉันตามตัวอย่างต่อไปนี้
ผมไม่เข้าใจปัจจัยพื้นฐานBitmap Heap Scan Node
ของ พิจารณาแบบสอบถามSELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
ซึ่งเป็นแผนนี้:
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)
ความเข้าใจของฉันเกี่ยวกับโหนดนี้ :
ตามที่ได้อธิบายมีผู้อ่านบล็อกตารางตามลำดับดังนั้นจึงไม่ได้ผลิตค่าใช้จ่ายในการสุ่มตารางการเข้าถึงที่เกิดขึ้นเป็นเพียงการทำbitmap heap scan
Index Scan
หลังจากIndex Scan
เสร็จสิ้นแล้ว PostgreSQL ไม่รู้วิธีดึงแถวอย่างเหมาะสมเพื่อหลีกเลี่ยงการไม่จำเป็นheap blocks reads
(หรือhits
หากมีแคชร้อน) ดังนั้นจะคิดออกจะสร้างโครงสร้าง ( Bitmap Index Scan
) เรียกว่าซึ่งในกรณีของฉันจะถูกสร้างขึ้นโดยการสร้างสองบิตแมปของดัชนีและการดำเนินการbitmap
ตั้งแต่บิตแมปที่ได้รับการสร้างขึ้นได้ในขณะนี้สามารถอ่านตารางได้อย่างดีที่สุดตามลำดับหลีกเลี่ยงที่ไม่จำเป็นBITWISE AND
heap I/O-operations
นั่นคือสถานที่ที่มีคำถามมากมาย
คำถาม:เรามีเพียงบิตแมป PostgreSQL รู้ได้อย่างไรเพียงแค่บิตแมปเกี่ยวกับลำดับทางกายภาพของแถว หรือสร้างบิตแมปเพื่อให้องค์ประกอบใด ๆ ของมันสามารถแมปกับตัวชี้ไปยังหน้าได้อย่างง่ายดาย? ถ้าเป็นเช่นนั้นจะอธิบายทุกอย่าง แต่มันก็เป็นเพียงการคาดเดาของฉัน
ดังนั้นเราสามารถพูดได้ง่ายๆว่าการbitmap heap scan -> bitmap index scan
สแกนตามลำดับ แต่เฉพาะส่วนที่เหมาะสมของตาราง?
001001010101011010101
ได้อย่างไร หรือจริง ๆ แล้วมันไม่สำคัญและสิ่งที่เราต้องรู้ก็คือมันสามารถหาบล็อกด้วยบิตแมปในวิธีที่รวดเร็ว ...