ฉันกำลังพยายามให้ PostgreSQL ทำการดูดฐานข้อมูลของฉันโดยอัตโนมัติ ฉันได้กำหนดค่าสูญญากาศอัตโนมัติดังนี้:
- autovacuum_vacuum_cost_delay = 0 # ปิดสูญญากาศที่ใช้ต้นทุน
- autovacuum_vacuum_cost_limit = 10,000 # ค่าสูงสุด
- autovacuum_vacuum_threshold = 50 # ค่าเริ่มต้น
- autovacuum_vacuum_scale_factor = 0.2 # ค่าเริ่มต้น
ฉันสังเกตว่าสูญญากาศอัตโนมัติจะเริ่มขึ้นเฉพาะเมื่อฐานข้อมูลไม่ได้โหลดดังนั้นฉันจึงเข้าสู่สถานการณ์ที่มีสิ่งอันดับที่ตายแล้วมากกว่าสิ่งอันดับสด ดูตัวอย่างภาพหน้าจอที่แนบมา หนึ่งในตารางมี 23 tuples สด แต่ 16845 tuples ตายรอสูญญากาศ นั่นมันบ้า!
Auto vacuum kicks เมื่อการทดสอบเสร็จสิ้นและเซิร์ฟเวอร์ฐานข้อมูลไม่ได้ใช้งานซึ่งไม่ใช่สิ่งที่ฉันต้องการเพราะฉันต้องการให้สูญญากาศอัตโนมัติเตะเมื่อใดก็ตามที่จำนวนของ tuples ที่ตายเกินกว่า 20% tuples สด + 50 เนื่องจากฐานข้อมูล การกำหนดค่า สูญญากาศอัตโนมัติเมื่อเซิร์ฟเวอร์ไม่ได้ใช้งานไม่มีประโยชน์สำหรับฉันเนื่องจากเซิร์ฟเวอร์ที่ใช้งานจริงคาดว่าจะมีการอัปเดต 1000 วินาที / วินาทีเป็นระยะเวลานานซึ่งเป็นสาเหตุที่ฉันต้องใช้ระบบสูญญากาศอัตโนมัติในการทำงานแม้ว่าเซิร์ฟเวอร์จะโหลด
มีอะไรที่ฉันขาดหายไปไหม ฉันจะบังคับให้สูญญากาศอัตโนมัติทำงานในขณะที่เซิร์ฟเวอร์มีภาระมากได้อย่างไร
ปรับปรุง
นี่อาจเป็นปัญหาการล็อคหรือไม่ ตารางที่ต้องสงสัยคือตารางสรุปที่บรรจุผ่านทริกเกอร์การแทรกหลัง ตารางเหล่านี้ถูกล็อคในโหมด SHARE ROW EXCLUSIVE เพื่อป้องกันการเขียนพร้อมกันในแถวเดียวกัน