บางคนสามารถอธิบายความแตกต่างระหว่างVACUUM
PostgreSQL ประเภทนี้ได้ไหม
ฉันอ่านเอกสาร แต่มันเพิ่งบอกว่าFULL
ล็อคตารางและFREEZE
"ค้าง" สิ่งอันดับ ฉันคิดว่ามันเหมือนกัน ฉันผิดหรือเปล่า?
บางคนสามารถอธิบายความแตกต่างระหว่างVACUUM
PostgreSQL ประเภทนี้ได้ไหม
ฉันอ่านเอกสาร แต่มันเพิ่งบอกว่าFULL
ล็อคตารางและFREEZE
"ค้าง" สิ่งอันดับ ฉันคิดว่ามันเหมือนกัน ฉันผิดหรือเปล่า?
คำตอบ:
นี่คือคำตอบสั้น ๆ สั้น ๆ
สูญญากาศเต็มนำออกล็อคพิเศษและสร้างตารางใหม่เพื่อให้ไม่มีบล็อกว่างเปล่า (เราจะสมมติว่าปัจจัยเติมเต็มคือ 100% ในตอนนี้)
การตรึงสุญญากาศทำเครื่องหมายเนื้อหาของตารางด้วยการประทับเวลาการทำธุรกรรมพิเศษที่บอก postgres ว่าไม่จำเป็นต้องถูกดูดตลอดเวลา อัปเดตครั้งต่อไปรหัสที่ตรึงนี้จะหายไป
ตัวอย่างเช่นฐานข้อมูล template0 ถูกหยุดเนื่องจากไม่มีการเปลี่ยนแปลง (โดยค่าเริ่มต้นคุณไม่สามารถเชื่อมต่อได้)
บ่อยครั้งที่ autovacuum daemon จะตรวจสอบฐานข้อมูลและตารางของมันเพื่อดูว่าต้องดูดฝุ่นอะไรบ้าง หากตารางเป็นสุญญากาศจะหยุดและไม่เคยอัปเดต autovacuum daemon จะผ่านไปโดยง่าย นอกจากนี้การป้องกัน "ล้อมรอบ" ใน postgresql จะไม่เริ่มขึ้นในตารางนั้นเช่นกัน
tl; dr freezing ทำเครื่องหมายตารางว่าไม่ต้องการการบำรุงรักษา autovac ใด ๆ การอัพเดทครั้งต่อไปจะยกเลิกการตรึงไว้
VACUUM FREEZE
ต้องล็อคพิเศษบนโต๊ะหรือไม่? ดูเหมือนว่าควรจะเป็นอย่างนั้นมิฉะนั้นคุณอาจเสี่ยงที่จะทำให้แถวจากธุรกรรมที่ใช้งานอยู่ทั่วโลกสามารถมองเห็นได้ ฉันอาจจะเข้าใจผิด ...
เพื่ออธิบายเพิ่มเติมสิ่งที่ Jayadevan เขียน
วิธีที่ Postgres ทำงานกับธุรกรรมและการติดตามข้อมูลที่มองเห็นได้คือการเปรียบเทียบรหัสธุรกรรมภายใน อย่างไรก็ตามเนื่องจากการทำธุรกรรมเหล่านั้นเป็นจำนวนเต็ม 32- บิตไม่ช้าก็เร็วพวกเขาจะล้อมรอบและดังนั้นการทำธุรกรรมใหม่จะดูเหมือนว่ามันทำในอดีต (และจะปรากฏในการทำธุรกรรมปัจจุบันในขณะที่มันไม่ควร) ในขณะที่ ธุรกรรมที่เก่ากว่าจะดูเหมือนว่าพวกเขากำลังดำเนินการในอนาคต (และเนื่องจากในอนาคตยังไม่มีข้อมูลนั้นจะไม่ปรากฏให้เห็นอีกต่อไป)
สิ่งที่ Postgres ทำเพื่อแก้ไขปัญหานั้นคือการกำหนดแต่ละแถวที่เก่าพอที่จะเสี่ยงต่อการประสบกับปัญหานี้โดยเฉพาะ id ธุรกรรมพิเศษที่เก่ากว่าทุก ๆ ธุรกรรม คุณสามารถดูได้ราวกับว่ารหัสธุรกรรมที่ถูกต้องอยู่ในช่วงตั้งแต่ 0 ถึง 2147483647 มันจะตั้งรหัสธุรกรรมสำหรับแถวปัจจุบันทั้งหมดเป็น -1
อย่างไรก็ตามเนื่องจากสูญญากาศนั้นโดยทั่วไปจะทำเครื่องหมายพื้นที่ว่างสำหรับการใช้งานซ้ำมันจึงใช้ได้กับหน้าข้อมูลที่มีการเปลี่ยนแปลงเท่านั้น
สิ่งที่VACUUM FREEZE
ทำคือพื้นตรึงรหัสธุรกรรมสำหรับทุกหน้าไม่ว่าถ้าพวกเขาได้รับการแก้ไขหรือไม่เพื่อให้ทุกแถวในปัจจุบันจะเห็นได้เช่นเดิมสำหรับการทำธุรกรรมใหม่ทั้งหมด
อย่างไรก็ตามเป็นรุ่น 8.2 VACUUM FREEZE
ได้ถูกคัดค้านและไม่ควรใช้ แต่มีพารามิเตอร์vacuum_freeze_table_age
และautovacuum_freeze_max_age
ระบุจำนวนธุรกรรมที่สามารถเกิดขึ้นได้ก่อนที่จะทำการสแกนเสร็จสิ้นบนโต๊ะ (ทำภายในภายในตารางอย่างมีประสิทธิภาพVACUUM FREEZE
)
VACUUM FREEZE
การถูกคัดค้าน / หมดกำลังใจ?
คัดลอก / วางจากคำตอบเมื่อฉันถามคำถามเดียวกัน - "สูญญากาศปกติทำเครื่องหมายพื้นที่ว่างสำหรับการใช้ซ้ำและ reclaims พื้นที่ว่างเปล่าในตอนท้ายของความสัมพันธ์ดังนั้นถ้าพื้นที่ว่างอยู่ตรงกลาง ฯลฯ จะไม่สามารถ เรียกคืนเพียงนำมาใช้ใหม่
สูญญากาศอัดเต็มความสัมพันธ์เรียกคืนพื้นที่ว่างทั้งหมด มันต้องมีการล็อคแบบเอกสิทธิ์และไม่ดีสำหรับระบบการผลิตโดยทั่วไปเพราะสิ่งนี้
ดังนั้นจุดประสงค์ของการสูญญากาศทั่วไปคือไม่เรียกคืนพื้นที่จากตาราง แต่เพื่อให้สามารถนำกลับมาใช้ใหม่ได้ในภายหลัง จุดประสงค์ของการสูญญากาศแบบเต็มคือการเรียกคืนพื้นที่ที่สูญเปล่าทั้งหมดด้วยค่าใช้จ่ายของการล็อคแบบเอกสิทธิ์เฉพาะบุคคลและประสิทธิภาพของฐานข้อมูลในขณะที่เกิด
ดังนั้นเนื่องจากสูญญากาศปกติไม่ได้ถูกออกแบบมาเพื่อเรียกคืนทุกสิ่งที่คุณไม่ควรแปลกใจที่จริงแล้วมันไม่ได้เรียกคืนทุกสิ่ง ลองการทดสอบของคุณกับชุดข้อมูลขนาดใหญ่ที่มีการลบแบบสุ่ม ฯลฯ เพื่อดูความแตกต่างระหว่างสุญญากาศปกติและเต็ม "
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
หากต้องการเพิ่มในส่วนนี้สุญญากาศเต็มจะสร้างไฟล์ใหม่สำหรับตาราง (ไฟล์ที่มีอยู่จะมีขนาดเป็น 0) ดังนั้นระบบปฏิบัติการสามารถเรียกคืนพื้นที่
VACUUM FREEZE
โดยเฉพาะ