เรากำลังใช้ Postgres 9.2 บน Windows เพื่อเก็บข้อมูลไทม์ความถี่ต่ำ: เราแทรกแถวประมาณ 2,000 แถวต่อวินาทีทุก ๆ 24 ชั่วโมง 7 วันต่อสัปดาห์โดยไม่มีการหยุดทำงาน มีการDELETE
วิ่งบนโต๊ะทุก ๆ 10 นาทีเพื่อให้ความยาวของตารางเท่ากับจำนวนวันที่กำหนด สิ่งนี้จบลงที่ความมั่นคง 900 ล้านแถว (สำหรับผู้ที่สนใจ, SELECT
, INSERT
, DELETE
มี performant ทั้งหมด)
เช่นDELETE
นี้ในขณะที่การลบแถวไม่ได้ทำให้พื้นที่ดิสก์ว่าง เพื่อที่เราจะต้องVACUUM
วิ่ง
ฉันสอบถามpg_stat_user_tables
และVACUUM
ดูเหมือนว่าจะไม่ได้ทำงาน
สิ่งที่ฉันเข้าใจจากเอกสารต่าง ๆ ( http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html ):
- ดูเหมือนว่าเราจะเปิดเครื่องดูดฝุ่นอัตโนมัติและจะทำงานในตารางอื่น
- สูญญากาศอัตโนมัติไม่ทำงาน
FULL
และไม่ควรใช้การล็อคแบบเอกสิทธิ์บนโต๊ะ
ไม่มีใครมีความคิดใด ๆ ว่าทำไมสูญญากาศอัตโนมัติไม่ทำงาน นี่เป็นเพียงเพราะตารางไม่ว่างอย่างต่อเนื่องหรือไม่
และมันก็คุ้มค่าที่จะทำงานVACUUM
หลังจากทุกอย่างDELETE
ในกรณีนี้ (ซึ่งทำงานทุก 10 นาที)?
แก้ไข:
การสืบค้นโดยใช้ SQL จากลิงก์ SO ด้านล่าง:
-[ RECORD 2 ]---+---------------------------
schemaname | stats
relname | statistic_values_by_sec
last_vacuum |
last_autovacuum |
n_tup | 932,315,264
dead_tup | 940,727,818
av_threshold | 186,463,103
expect_av | *
และผลผลิตดิบ:
-[ RECORD 3 ]-----+---------------------------
relid | 501908
schemaname | stats
relname | statistic_values_by_sec
seq_scan | 12
seq_tup_read | 4526762064
idx_scan | 29643
idx_tup_fetch | 2544206912
n_tup_ins | 1573896877
n_tup_upd | 0
n_tup_del | 941176496
n_tup_hot_upd | 0
n_live_tup | 688858417
n_dead_tup | 940727818
last_vacuum |
last_autovacuum |
last_analyze |
last_autoanalyze | 2014-08-09 01:36:21.703+01
vacuum_count | 0
autovacuum_count | 0
analyze_count | 0
autoanalyze_count | 69
select * from pg_stat_user_tables
สำหรับตารางนี้ (ใช้\x
ใน psql สำหรับผลลัพธ์ที่มีการจัดรูปแบบเป็นอย่างดี)