ตารางไม่ได้รับการดูด


11

เรากำลังใช้ 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

4
ดูAutovacuum ก้าวร้าวใน PostgreSQL นอกจากนี้ยังเป็นเรื่องที่น่าสนใจselect * from pg_stat_user_tablesสำหรับตารางนี้ (ใช้\xใน psql สำหรับผลลัพธ์ที่มีการจัดรูปแบบเป็นอย่างดี)
Daniel Vérité

2
ลิงค์นั้นมีประโยชน์และอาจตอบคำถามได้ - ตารางไม่ว่างสำหรับเครื่องดูดฝุ่นอัตโนมัติที่จะทำงาน @ DanielVéritéฉันได้อัปเดตคำถามด้วยผลลัพธ์ที่คุณถาม
Barry

3
นั่นเป็นสิ่งอันดับมากที่ตายแล้ว! หากเป็นไปได้ให้พิจารณาการแบ่งพาร์ติชันตารางโดยการประทับเวลาและวางพาร์ติชันเก่าแทนการลบ ข้อแม้หลักที่ว่าดัชนีไม่ซ้ำกันข้ามพาร์ติชันไม่ได้รับการสนับสนุน
Daniel Vérité

1
ไฟล์บันทึกมีข้อความเกี่ยวกับ autovacuum ในตารางนี้ถูกยกเลิกหรือไม่
jjanes

@jjanes No - ไม่มีข้อบ่งชี้ในบันทึกที่มีการเริ่มต้นอัตโนมัติอีกครั้ง
Barry

คำตอบ:


2

ฉันจะมองเข้าไปในการแบ่ง หากแบ่งพาร์ติชันตามวันคุณสามารถลบพาร์ติชันทั้งหมดเมื่อพาร์ทิชันเก่าเกินไป คุณอาจไม่ต้องดูดฝุ่นอีกต่อไป

นอกจากนี้ประสิทธิภาพโดยรวมอาจเพิ่มขึ้นเนื่องจากคุณไม่ได้แทรกตำแหน่งที่จะลบ คุณเพียงแค่ต้องเขียนรหัสเพื่อสร้างพาร์ติชันใหม่และลบพาร์ทิชันเก่า

นี่คือสิ่งที่พาร์ทิชันสำหรับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.