การเรียกใช้ VACUUM บนโต๊ะที่รับเฉพาะ INSERT นั้นคุ้มค่าหรือไม่


19

ในปี 2558 เรื่องการประดิษฐ์คิดค้น AWS กล่าวว่าเครื่องดูดฝุ่นควรทำงานไม่เพียง แต่หลังจากการปรับปรุงหรือลบ แต่ยังหลังจากการแทรก นี่คือส่วนที่เกี่ยวข้องของการพูดคุย:

http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s

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

คำตอบ:


15

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ใช่ไหม?
dezso

3
กระทำและย้อนกลับไม่จริงสัมผัสหน้าข้อมูลจึงไม่มีคำสั่งเหล่านั้นโดยเฉพาะอาจจะไม่เคยใบ้ คำสั่ง DML ยังคงสามารถตั้งค่าสถานะคำใบ้ทั้ง xmin และ xmax ทั้งสำหรับ tuples ที่ทำเครื่องหมายโดยธุรกรรมอื่น ๆ หรือแม้กระทั่ง tuples ที่ทำเครื่องหมายโดยธุรกรรมปัจจุบัน
Jim Nasby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.