0Pricing
SQL Academy · บทเรียน

VACUUM, autovacuum, vacuum_cost_delay

ปรับค่าเกณฑ์ autovacuum, vacuum_cost_delay และ VACUUM แบบขนานสำหรับตารางขนาดใหญ่

VACUUM, autovacuum, vacuum_cost_delay เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

VACUUM สามโหมด

  • VACUUM (แบบผ่อนปรน) — เรียกคืนแถวที่ไม่ใช้งาน อัปเดตแผนผังพื้นที่ว่าง และไม่ใช้ล็อกแบบเอกซ์คลูซีฟ
  • VACUUM FULL — เขียนตารางใหม่ ใช้ล็อกแบบเอกซ์คลูซีฟ และคืนพื้นที่ดิสก์ให้ OS
  • VACUUM ANALYZE — ทำ VACUUM และรีเฟรชสถิติของตัววางแผนคำสั่งในครั้งเดียว

เรียกใช้ VACUUM ด้วยตนเอง

บางครั้งยังมีประโยชน์แม้เปิดใช้ autovacuum อยู่:

VACUUM (VERBOSE) orders;
VACUUM (VERBOSE, ANALYZE) orders;
VACUUM (PARALLEL 4) orders;       -- parallel index cleanup (PG 13+)

กระบวนการ Autovacuum

ตัวเรียกใช้เบื้องหลังจะสร้างผู้ปฏิบัติงานเพื่อทำ VACUUM ให้ตารางที่มีค่าการเปลี่ยนแปลงเกินเกณฑ์ โดยค่าเริ่มต้น ผู้ปฏิบัติงานจำนวนหนึ่งจะดูแลคลัสเตอร์ทั้งหมด

การปรับแต่งรายตาราง

ตารางที่มีการใช้งานสูงจะได้ประโยชน์จาก autovacuum ที่ทำงานเชิงรุก:

ALTER TABLE busy_table SET (
  autovacuum_vacuum_scale_factor = 0.05,    -- 5% dead vs default 20%
  autovacuum_vacuum_threshold    = 1000,
  autovacuum_analyze_scale_factor = 0.05
);

vacuum_cost_delay

จำกัดการทำงานด้านอินพุต/เอาต์พุตของ VACUUM เพื่อไม่ให้กระทบต่อคำสั่งสอบถามเบื้องหน้า ค่าเริ่มต้นของ PG 12 ขึ้นไปคือ 2ms ซึ่งโดยทั่วไปเพียงพอแล้ว สำหรับ SSD สามารถลดค่านี้ได้:

autovacuum_vacuum_cost_delay = 2ms
-- Lower delay = faster vacuum, more I/O usage.
-- Set per-table for hot tables that need faster cleanup.

VACUUM แบบขนาน

ตั้งแต่ PG 13 เป็นต้นมา VACUUM จะทำความสะอาดดัชนีแบบขนานได้:

VACUUM (PARALLEL 4) big_table;
-- Each index cleaned by a parallel worker (up to max_parallel_maintenance_workers).

VACUUM FULL: ใช้เมื่อใดและเพราะเหตุใด

เขียนตารางใหม่ตั้งแต่ต้นและคืนพื้นที่ให้ OS โดยใช้ ACCESS EXCLUSIVE ควรใช้เป็นทางเลือกสุดท้ายเท่านั้น หรือใช้ pg_repack แทน

VACUUM FULL orders;
-- Locks orders; rewrites; on huge tables this is hours of downtime.

pg_repack: ทางเลือกแบบออนไลน์

เขียนตารางใหม่แบบออนไลน์โดยไม่ใช้ล็อกเต็มรูปแบบ ให้ผลเช่นเดียวกับ VACUUM FULL แต่เหมาะกับระบบใช้งานจริงมากกว่า:

pg_repack -d mydb -t orders
-- Builds a shadow table, sync, swaps in.

การเฝ้าติดตาม Autovacuum

ดูเวลาที่ทำ vacuum/analyze ครั้งล่าสุดและจำนวนทูเพิลที่ไม่ใช้งาน:

SELECT relname,
       n_live_tup, n_dead_tup,
       last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

เมื่อ Autovacuum ทำงานไม่ทัน

อาการที่พบ:

  • ข้อมูลส่วนเกินเพิ่มขึ้น
  • ค่า n_dead_tup ใน pg_stat_user_tables สูง
  • แผนการทำงานของคำสั่งสอบถามแย่ลง

วิธีแก้: เพิ่มค่า autovacuum_max_workers ลดปัจจัยการปรับขนาดรายตาราง และแก้ไขธุรกรรมที่ทำงานนานซึ่งขัดขวาง VACUUM

การบันทึกการทำงานของ Vacuum

เพื่อการปรับแต่ง ให้บันทึก VACUUM ที่ทำงานช้า:

log_autovacuum_min_duration = '500ms'
-- Logs every autovacuum action that took longer than 500ms.

FREEZE

VACUUM จะ "ตรึง" ทูเพิลเก่าเป็นครั้งคราว เพื่อป้องกันการวนกลับของ xid Autovacuum ที่ทำงานเชิงรุกจะรักษาอายุการตรึงให้อยู่ในระดับต่ำ และป้องกันเหตุการณ์วนกลับฉุกเฉิน

สรุปทบทวน

Autovacuum เป็นสิ่งจำเป็น ควรปรับแต่งให้เหมาะกับลักษณะงาน

  • ตั้งค่า autovacuum รายตารางสำหรับตารางที่มีการใช้งานสูง
  • VACUUM FULL เป็นทางเลือกสุดท้าย — ควรใช้ pg_repack มากกว่า
  • เฝ้าติดตาม n_dead_tup และ last_autovacuum
  • แก้ไขธุรกรรมที่ทำงานนานซึ่งขัดขวางการทำความสะอาด

ตรวจสอบอย่างรวดเร็ว

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

คำถามที่พบบ่อย

บทเรียน “VACUUM, autovacuum, vacuum_cost_delay” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “VACUUM, autovacuum, vacuum_cost_delay” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “VACUUM, autovacuum, vacuum_cost_delay”

ปรับค่าเกณฑ์ autovacuum, vacuum_cost_delay และ VACUUM แบบขนานสำหรับตารางขนาดใหญ่ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “VACUUM, autovacuum, vacuum_cost_delay” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. MVCC และสาเหตุของข้อมูลบวม
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE และ pg_statistic
  4. การสแกนเฉพาะดัชนีและแผนที่การมองเห็น
← กลับไปที่ SQL Academy