ฉันต้องการทราบหลักการของ "Bitmap heap scan" ฉันรู้ว่าสิ่งนี้มักเกิดขึ้นเมื่อฉันดำเนินการค้นหาโดยOR
อยู่ในเงื่อนไข
ใครสามารถอธิบายหลักการเบื้องหลัง "Bitmap heap scan" ได้บ้าง
ฉันต้องการทราบหลักการของ "Bitmap heap scan" ฉันรู้ว่าสิ่งนี้มักเกิดขึ้นเมื่อฉันดำเนินการค้นหาโดยOR
อยู่ในเงื่อนไข
ใครสามารถอธิบายหลักการเบื้องหลัง "Bitmap heap scan" ได้บ้าง
คำตอบ:
คำอธิบายที่ดีที่สุดมาจาก Tom Laneซึ่งเป็นผู้เขียนอัลกอริทึมเว้นแต่ฉันจะเข้าใจผิด เห็นแล้วยังบทความวิกิพีเดีย
ในระยะสั้นมันคล้ายกับการสแกน seq ความแตกต่างคือแทนที่จะไปที่หน้าดิสก์ทุกหน้าดัชนีบิตแมปจะสแกน ANDs และ ORs ดัชนีที่เกี่ยวข้องพร้อมกันและเข้าชมเฉพาะหน้าดิสก์ที่จำเป็นเท่านั้น
สิ่งนี้แตกต่างจากการสแกนดัชนีซึ่งดัชนีจะถูกเยี่ยมชมทีละแถวตามลำดับซึ่งหมายความว่าอาจมีการเยี่ยมชมหน้าดิสก์หลายครั้ง
Re: คำถามในความคิดเห็นของคุณ ... ใช่นั่นแหล่ะ
การสแกนดัชนีจะดำเนินการทีละแถวโดยเปิดดิสก์เพจซ้ำแล้วซ้ำอีกหลาย ๆ ครั้งตามความจำเป็น (แน่นอนว่าบางส่วนจะอยู่ในหน่วยความจำ แต่คุณจะเข้าใจ)
การสแกนดัชนีบิตแมปจะเปิดรายการหน้าดิสก์สั้น ๆ ตามลำดับและดึงทุกแถวที่เกี่ยวข้องในแต่ละแถว (ดังนั้นจึงเรียกอีกครั้งว่า condheck ที่คุณเห็นในแผนแบบสอบถาม)
หมายเหตุนอกจากนี้การจัดเรียงคลัสเตอร์ / ลำดับแถวมีผลต่อต้นทุนที่เกี่ยวข้องกับวิธีใดวิธีหนึ่ง หากแถวอยู่ทั่วสถานที่ในลำดับแบบสุ่มดัชนีบิตแมปจะถูกกว่า (และในความเป็นจริงถ้ามันอยู่ทั่วทุกที่จริงๆการสแกน seq จะมีราคาถูกที่สุดเนื่องจากการสแกนดัชนีบิตแมปไม่ได้โดยไม่มีค่าใช้จ่าย)
index-only scan
เมื่อเข้าถึงคอลัมน์ที่จัดทำดัชนีเท่านั้นในแบบสอบถาม ในกรณีindex-only scan
นี้ไม่จำเป็นต้องเข้าถึงข้อมูลฮีป (หน้าข้อมูล): postgresql.org/docs/12/indexes-index-only-scans.html