tl; dr: กระบวนการแรกที่อ่านข้อมูลหลังจากที่ถูกคอมมิทจะกำหนดบิตคำใบ้ นั่นจะทำให้หน้าสกปรกสร้างกิจกรรมการเขียน สิ่งอื่น ๆVACUUM
(แต่ไม่ใช่คำสั่งอื่น ๆ ) จะทำเครื่องหมายหน้าว่ามองเห็นได้ทั้งหมดหากเหมาะสม VACUUM
ในที่สุดจะต้องกดโต๊ะเพื่อตรึงสิ่งอันดับ
งานที่ต้องทำหลังจากการแทรกไม่ได้ทำความสะอาดจริง ๆ อย่างน้อยก็ไม่ได้อยู่ในความหมายของงานอื่น ๆVACUUM
ตามปกติ ก่อนที่ฉันจะลงรายละเอียดโปรดทราบว่าคำตอบนี้ขึ้นอยู่กับรหัส 9.6 ปัจจุบัน (ยังไม่ได้เผยแพร่) และฉันไม่สนใจผลกระทบของการจำลองแบบการสตรีมแม้ว่าจะมีผลกระทบต่อการมองเห็น
เนื่องจากMVCCทุกครั้งที่ Postgres ประเมินว่าควรมองเห็น tuple กับเคียวรีหรือไม่จึงต้องพิจารณาว่าธุรกรรมที่สร้าง tuple (บันทึกในเขตข้อมูล xmin ที่ซ่อนอยู่) ที่ทำไว้พร้อมกับเกณฑ์อื่น ๆ การตรวจสอบนั้นมีราคาแพงดังนั้นทันทีที่ทราบว่าการทำธุรกรรมสามารถมองเห็นได้จากการทำธุรกรรมที่เปิดอยู่ในปัจจุบันทั้งหมดจะมีการตั้ง "บิตคำใบ้" ไว้ที่ส่วนหัว tuple ซึ่งระบุว่า การตั้งค่าของบิตนั้นสกปรกหน้าซึ่งหมายความว่ามันจะต้องถูกเขียนไปยังดิสก์ สิ่งนี้อาจสร้างความสับสนได้มากหากคำสั่งถัดไปในการอ่านข้อมูลคือสิ่งSELECT
ที่สร้างปริมาณการใช้ข้อมูลการเขียนในทันที การรันVACUUM
หลังจากการแทรกจะเป็นการหลีกเลี่ยง ความแตกต่างที่สำคัญอีกอย่างก็คือVACUUM
จะเป็นการบอกใบ้ให้ทราบบนหน้า (ตราบใดที่มันมีการล็อคการล้างข้อมูลบนหน้า) แต่คำสั่งอื่น ๆ ส่วนใหญ่จะบอกใบ้ถ้าธุรกรรมการแทรกที่กระทำก่อนคำสั่งเริ่มต้น
จุดสำคัญเกี่ยวกับการเขียนบิตคำใบ้เหล่านี้คือVACUUM
สามารถที่จะควบคุมปริมาณได้ คำสั่งอื่น ๆ ไม่ได้ควบคุมปริมาณและจะสร้างข้อมูลที่สกปรกให้เร็วที่สุด
VACUUM
เป็นวิธีการเดียวในการทำเครื่องหมายหน้าเว็บว่าเป็นแบบมองเห็นได้ทั้งหมดซึ่งเป็นการพิจารณาประสิทธิภาพที่สำคัญสำหรับการดำเนินการบางอย่าง (โดยเฉพาะการสแกนดัชนีเท่านั้น) หากคุณแทรกขนาดใหญ่เป็นไปได้มากว่าจะมีหลาย ๆ หน้าที่ไม่มีอะไรเลยนอกจาก tuples ที่เพิ่งแทรกใหม่ VACUUM
ที่อาจเกิดขึ้นสามารถทำเครื่องหมายหน้าเว็บเหล่านั้นเป็นสิ่งที่มองเห็น, แต่ถ้าการทำธุรกรรมการทำงานที่เก่าแก่ที่สุดเมื่อVACUUM
เริ่มเป็นใหม่กว่ารายการที่แทรกข้อมูล
เนื่องจาก MVCC ทำงานอย่างไรสิ่งอันดับที่ถูกแทรกมากกว่า ~ 2 พันล้านธุรกรรมที่ผ่านมาต้องถูกทำเครื่องหมายว่า " แช่แข็ง " โดยค่าเริ่มต้น autovacuum จะทำในการทำธุรกรรมทุก 200M การรันสุญญากาศแบบแมนนวลโดยใช้ vacuum_freeze_min_age ตั้งค่าเป็น 0 หลังจากการแทรกจำนวนมากสามารถช่วยลดผลกระทบที่เกิดขึ้นได้ ยิ่งก้าวร้าวคุณสามารถวิ่งVACUUM FREEZE
บนโต๊ะได้หลังจากใส่แล้ว ที่จะ "รีเซ็ตนาฬิกา" ในเมื่อการสแกนค้างต่อไปจะเกิดขึ้น
หากคุณต้องการทราบรายละเอียดที่เฉพาะเจาะจงให้ดูที่เป็นHEAPTUPLE_LIVE
กรณีหลังจากการเรียกร้องให้ภายในHeapTupleSatisfiesVacuum()
lazy_scan_heap()
ดูเพิ่มเติมเองและเปรียบเทียบกับHeapTupleSatisfiesVacuum()
HeapTupleSatisfiesMVCC()
มีอีกสองงานนำเสนอของฉันที่น่าสนใจ วิดีโอแรกมีให้บริการจากhttp://www.pgcon.org/2015/schedule/events/829.en.htmlในขณะที่วิดีโอที่สอง (ซึ่งฉันคิดว่าดีขึ้นเล็กน้อย) ที่https://www.youtube co.th / นาฬิกา? v = L8nErzxPJjQ
EXPLAIN (ANALYZE, BUFFERS) outputs. But, if I understand things correctly, some of the hint bits (at least
* COMMITTED` และ*INVALID
) สามารถ (อาจ) ถูกตั้งค่าโดยCOMMIT
หรือROLLBACK
ใช่ไหม?