ANALYZE และ pg_statistic
ทำให้สถิติของตัววางแผนเป็นปัจจุบันด้วย ANALYZE ตรวจสอบ pg_statistic และใช้สถิติขั้นสูงสำหรับคอลัมน์ที่มีความสัมพันธ์กัน
ANALYZE และ pg_statistic เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องใช้ ANALYZE
ตัววางแผนคำสั่งสอบถามจำเป็นต้องประมาณจำนวนแถวและความสามารถในการเลือก เพื่อเลือกแผนที่ดี ค่าประมาณเหล่านี้มาจากสถิติรายคอลัมน์ที่รวบรวมโดย ANALYZE
ควรเรียกใช้ ANALYZE เมื่อใด
Autovacuum จะเรียกใช้ ANALYZE โดยอัตโนมัติตามเกณฑ์จำนวนแถวที่เปลี่ยนแปลง หลังจากโหลดข้อมูลจำนวนมากหรือใช้ DELETE จำนวนมาก ควรเรียกใช้ด้วยตนเองเพื่อไม่ให้แผนการทำงานแย่ลง:
ANALYZE orders;
ANALYZE (VERBOSE) orders;การสุ่มตัวอย่าง
ANALYZE จะสุ่มตัวอย่างข้อมูลสองสามร้อยแถวจากแต่ละคอลัมน์ ปรับเป้าหมายสถิติหากค่าเริ่มต้นให้ค่าประมาณที่ไม่ดี:
ALTER TABLE orders ALTER COLUMN customer_id SET STATISTICS 1000;
-- Up from default 100. ANALYZE will sample more rows.pg_statistic
แค็ตตาล็อกระบบที่เก็บสถิติไว้ (ใช้วิว pg_stats เพื่อให้อ่านได้ง่ายขึ้น):
SELECT attname, n_distinct, most_common_vals, most_common_freqs, histogram_bounds
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';สิ่งที่ตัววางแผนคำสั่งสอบถามพิจารณา
- n_distinct — จำนวนค่าที่แตกต่างกัน
- most_common_vals — ค่ายอดนิยมและความถี่ของค่าเหล่านั้น
- histogram_bounds — ช่วงแบ่งสำหรับคำสั่งสอบถามแบบช่วง
- correlation — ลำดับทางกายภาพเทียบกับลำดับเชิงตรรกะ (มีผลต่อต้นทุนการสแกน)
สถิติแบบขยาย
สถิติรายคอลัมน์ไม่ครอบคลุมความสัมพันธ์ระหว่างคอลัมน์ CREATE STATISTICS จะบันทึกความสัมพันธ์เหล่านี้:
CREATE STATISTICS orders_country_status (dependencies)
ON country, status FROM orders;
ANALYZE orders;
-- Now the planner knows that country='US' AND status='paid' is correlated
-- (e.g. most US orders happen to be 'paid').ชนิดของสถิติหลายตัวแปร
dependencies— การขึ้นต่อกันเชิงฟังก์ชัน (คอลัมน์หนึ่งใช้ทำนายอีกคอลัมน์ได้)ndistinct— ชุดค่าที่แตกต่างกันmcv— ค่าผสมที่พบบ่อยที่สุด (PG 12 ขึ้นไป)
ค่าประมาณไม่ดี → แผนไม่ดี
สาเหตุที่พบบ่อยที่สุดของคำถามว่า "เหตุใดคำสั่งสอบถามของฉันจึงช้า" คือการประมาณจำนวนแถวที่ไม่ดี ตัววางแผนคำสั่งสอบถามเลือก Nested Loop เพราะคาดว่าจะมี 1 แถว แต่ความเป็นจริงมี 1,000,000 แถว
EXPLAIN ANALYZE SELECT * FROM ... ;
-- Look at Plan rows vs actual rows. Big gap = run ANALYZE or add extended stats.บังคับใช้ ANALYZE ในการย้ายข้อมูล
หลังจากโหลดข้อมูลจำนวนมาก:
COPY users FROM ... ;
ANALYZE users;
-- Without ANALYZE, the planner has no idea the table just grew.สถิติจะไม่อัปเดตโดยอัตโนมัติเมื่อข้อมูลเบ้
หากข้อมูลของวันนี้แตกต่างจากเมื่อวานอย่างมาก สถิติอาจยังล้าสมัยจนกว่า autoanalyze จะทำงาน ควรใช้ ANALYZE ด้วยตนเองหลังจากรูปแบบข้อมูลเปลี่ยนแปลง
pg_class.reltuples
ตัววางแผนคำสั่งสอบถามยังใช้ค่าประมาณจำนวนแถวจาก pg_class ซึ่งอัปเดตโดย VACUUM/ANALYZE ตรวจสอบได้อย่างรวดเร็ว:
SELECT relname, reltuples FROM pg_class WHERE relname = 'orders';สรุปทบทวน
ANALYZE จะป้อนข้อมูลให้ตัววางแผนคำสั่งสอบถาม
- เรียกใช้หลังจากข้อมูลเปลี่ยนแปลงครั้งใหญ่
- เพิ่มเป้าหมาย STATISTICS สำหรับคอลัมน์ที่มีการกระจายตัวเบ้
- ใช้ CREATE STATISTICS สำหรับความสัมพันธ์ระหว่างคอลัมน์
- ช่องว่างขนาดใหญ่ระหว่างค่าประมาณกับค่าจริง = สิ่งแรกที่ควรแก้
ตรวจสอบอย่างรวดเร็ว
EXPLAIN ANALYZE แสดง estimated rows=1 แต่ actual rows=500,000 ในคำสั่งสอบถามแบบ WHERE คอลัมน์เดียว ควรแก้ไขสิ่งใดเป็นอันดับแรก
คำถามที่พบบ่อย
บทเรียน “ANALYZE และ pg_statistic” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ANALYZE และ pg_statistic” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ANALYZE และ pg_statistic”
ทำให้สถิติของตัววางแผนเป็นปัจจุบันด้วย ANALYZE ตรวจสอบ pg_statistic และใช้สถิติขั้นสูงสำหรับคอลัมน์ที่มีความสัมพันธ์กัน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ANALYZE และ pg_statistic” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- MVCC และสาเหตุของข้อมูลบวม
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE และ pg_statistic
- การสแกนเฉพาะดัชนีและแผนที่การมองเห็น