“ Bitmap heap scan” ในแผนการสืบค้นคืออะไร?


113

ฉันต้องการทราบหลักการของ "Bitmap heap scan" ฉันรู้ว่าสิ่งนี้มักเกิดขึ้นเมื่อฉันดำเนินการค้นหาโดยORอยู่ในเงื่อนไข

ใครสามารถอธิบายหลักการเบื้องหลัง "Bitmap heap scan" ได้บ้าง

คำตอบ:


122

คำอธิบายที่ดีที่สุดมาจาก Tom Laneซึ่งเป็นผู้เขียนอัลกอริทึมเว้นแต่ฉันจะเข้าใจผิด เห็นแล้วยังบทความวิกิพีเดีย

ในระยะสั้นมันคล้ายกับการสแกน seq ความแตกต่างคือแทนที่จะไปที่หน้าดิสก์ทุกหน้าดัชนีบิตแมปจะสแกน ANDs และ ORs ดัชนีที่เกี่ยวข้องพร้อมกันและเข้าชมเฉพาะหน้าดิสก์ที่จำเป็นเท่านั้น

สิ่งนี้แตกต่างจากการสแกนดัชนีซึ่งดัชนีจะถูกเยี่ยมชมทีละแถวตามลำดับซึ่งหมายความว่าอาจมีการเยี่ยมชมหน้าดิสก์หลายครั้ง


Re: คำถามในความคิดเห็นของคุณ ... ใช่นั่นแหล่ะ

การสแกนดัชนีจะดำเนินการทีละแถวโดยเปิดดิสก์เพจซ้ำแล้วซ้ำอีกหลาย ๆ ครั้งตามความจำเป็น (แน่นอนว่าบางส่วนจะอยู่ในหน่วยความจำ แต่คุณจะเข้าใจ)

การสแกนดัชนีบิตแมปจะเปิดรายการหน้าดิสก์สั้น ๆ ตามลำดับและดึงทุกแถวที่เกี่ยวข้องในแต่ละแถว (ดังนั้นจึงเรียกอีกครั้งว่า condheck ที่คุณเห็นในแผนแบบสอบถาม)

หมายเหตุนอกจากนี้การจัดเรียงคลัสเตอร์ / ลำดับแถวมีผลต่อต้นทุนที่เกี่ยวข้องกับวิธีใดวิธีหนึ่ง หากแถวอยู่ทั่วสถานที่ในลำดับแบบสุ่มดัชนีบิตแมปจะถูกกว่า (และในความเป็นจริงถ้ามันอยู่ทั่วทุกที่จริงๆการสแกน seq จะมีราคาถูกที่สุดเนื่องจากการสแกนดัชนีบิตแมปไม่ได้โดยไม่มีค่าใช้จ่าย)


ดังนั้น "Bitmap heap scan": ไม่สามารถเยี่ยมชมเพจได้มากกว่าหนึ่งครั้ง! แต่ "ดัชนีสามารถ": สามารถเข้าชมเพจได้มากกว่าหนึ่งครั้งเนื่องจากดัชนีถูกเยี่ยมชมทีละแถวตามลำดับ
ฟรังก์

อาจมีการแคชที่เกี่ยวข้องเมื่อมีการเยี่ยมชมเพจหลายครั้ง: เพจจะถูกโหลดจากดิสก์ในครั้งแรก (ช้า) และการเข้าถึงเพิ่มเติมจะเข้าสู่แคชในหน่วยความจำ (แคช Postgres (เร็ว) หรือแคชของระบบปฏิบัติการ (เร็วกว่า)) .
Matthieu

นอกจากนี้ยังมีindex-only scanเมื่อเข้าถึงคอลัมน์ที่จัดทำดัชนีเท่านั้นในแบบสอบถาม ในกรณีindex-only scanนี้ไม่จำเป็นต้องเข้าถึงข้อมูลฮีป (หน้าข้อมูล): postgresql.org/docs/12/indexes-index-only-scans.html
อลัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.