วงจรการทำงานของคิวรีและ Query Planner

การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

Amy McCarty

Instructor

วงจรการทำงานพื้นฐานของคิวรี

ระบบ ขั้นตอน Front end กระบวนการ Back end
1 Parser ส่งคิวรีไปยังฐานข้อมูล ตรวจสอบ syntax และแปลง SQL ให้อยู่ในรูปแบบที่คอมพิวเตอร์เข้าใจได้ง่ายขึ้น โดยอิงจากกฎที่เก็บไว้ในระบบ
2 Planner & Optimizer ประเมินและปรับคิวรีให้เหมาะสม ใช้สถิติของฐานข้อมูลเพื่อสร้าง query plan คำนวณต้นทุนและเลือกแผนที่ดีที่สุด
3 Executor ส่งคืนผลลัพธ์ของคิวรี ดำเนินการคิวรีตาม query plan
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

Query Planner และ Optimizer

ตอบสนองต่อการเปลี่ยนแปลงโครงสร้าง SQL

  • สร้าง plan tree
    • แต่ละโหนดแทนขั้นตอนการทำงาน
    • ดูภาพด้วย EXPLAIN
  • ประมาณต้นทุนของแต่ละ tree
    • สถิติจาก pg_tables
    • การปรับแต่งตามเวลา
1 Plan tree: https://www.postgresql.org/docs/current/querytree.html
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

สถิติจาก pg_tables

SELECT * FROM pg_class
WHERE relname = 'mytable'
-- sample of output columns
| relname | relhasindex |
SELECT * FROM pg_stats
WHERE tablename = 'mytable'
-- sample of output columns
null_frac | avg_width | n_distinct | 
  • Index ของคอลัมน์
  • จำนวนค่า null
  • ความกว้างของคอลัมน์
  • ค่าที่ไม่ซ้ำกัน
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

EXPLAIN

 

  • มุมมองเข้าสู่ query plan
  • ขั้นตอนและการประมาณต้นทุน
    • ไม่ได้รันคิวรีจริง

 

  • Sequential scan บนตาราง cheeses
  • การประมาณต้นทุนและขนาด

 

EXPLAIN
SELECT * FROM cheeses

 

Seq Scan on cheeses 
(cost=0.00..10.50 rows=5725 width=296)
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

EXPLAIN: การสแกน

 

  • ขั้นตอนใน query plan
  • คืนค่าแถวข้อมูล

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

 

  • Seq Scan : สแกนทุกแถวในตาราง
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

EXPLAIN: ต้นทุน

 

  • ไม่มีหน่วย
  • เปรียบเทียบโครงสร้างที่มี output เหมือนกัน
    • ไม่ควรเปรียบเทียบคิวรีที่มี output ต่างกัน

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

 

 

  • 0.00.. : เวลาเริ่มต้น
  • ..10.50 : เวลาทั้งหมด

  • เวลาทั้งหมด = เวลาเริ่มต้น + เวลารัน

การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

EXPLAIN: ขนาด

 

  • การประมาณขนาด

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

  • rows : จำนวนแถวที่คิวรีต้องตรวจสอบ
  • width : ความกว้างของแถวในหน่วยไบต์
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

EXPLAIN กับคำสั่ง WHERE

EXPLAIN
SELECT * FROM cheeses WHERE species IN ('goat','sheep') 
Seq Scan on cheeses (cost=0.00..378.90 rows=3 width=118)
 -> Filter: (species = ANY ('{"goat","sheep"}'::text[]))
  • อ่านจากล่างขึ้นบน
    • ขั้นที่ 1: Filter
    • ขั้นที่ 2: Sequential scan
  • คำสั่ง WHERE
    • ลดจำนวนแถวที่สแกน แต่เพิ่มต้นทุนรวม
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

EXPLAIN กับ index

EXPLAIN
SELECT * FROM cheeses WHERE species IN ('goat','sheep') -- index on species column
Bitmap Index Scan using species_idx on cheeses (cost=0.29..12.66 rows=3 width=118)
  Index Cond: (species = ANY ('{"goat","sheep"}'::text[]))
  • ขั้นที่ 1: Bitmap Index Scan
    • Index Cond อธิบายขั้นตอนการสแกน
  • INDEX
    • ต้นทุนเริ่มต้นเพิ่มขึ้นจาก 0
    • ต้นทุนรวมลดลงจาก 379
การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

มาฝึกกันเถอะ!

การเพิ่มประสิทธิภาพคิวรีใน PostgreSQL

Preparing Video For Download...