ปัญหา Query ช้า เป็นสิ่งที่เกิดขึ้นบ่อยในระบบที่ใช้ฐานข้อมูล PostgreSQL โดยเฉพาะเมื่อข้อมูลมีปริมาณมากขึ้นหรือ Query มีความซับซ้อน การ Optimize Query จึงเป็นสิ่งสำคัญที่ช่วยให้ระบบตอบสนองได้รวดเร็วขึ้น ในบทความนี้เราจะเรียนรู้เทคนิค เช่น Index Hint, Rewrite Query, และ Denormalization
1. ใช้ EXPLAIN / ANALYZE เพื่อตรวจสอบ
ก่อน Optimize ควรตรวจสอบว่า Query ทำงานอย่างไร โดยใช้ EXPLAIN
หรือ EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123;
Output จะบอกว่ามีการใช้ Index หรือไม่ และใช้วิธี Scan แบบใด (Seq Scan, Index Scan, Bitmap Index Scan)

2. Index Hint (เลือก Index ที่เหมาะสม)
PostgreSQL ไม่มี Index Hint โดยตรงเหมือน MySQL แต่สามารถบังคับผ่าน enable_seqscan = off
หรือสร้าง Index ที่เหมาะสมแทน
-- ปิด Seq Scan เพื่อบังคับใช้ Index SET enable_seqscan = off; -- สร้าง Index ที่เหมาะสม CREATE INDEX idx_orders_user_id ON orders(user_id);
3. การ Rewrite Query
บางครั้ง Query ช้าสามารถแก้ได้ด้วยการ Rewrite หรือเขียนใหม่ให้มีประสิทธิภาพมากขึ้น เช่น การใช้ JOIN
แทน Subquery
ตัวอย่าง Query ช้า
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE total > 1000);
Rewrite ให้เร็วขึ้น
SELECT u.name FROM users u JOIN orders o ON u.id = o.user_id WHERE o.total > 1000;
4. การ Denormalization
ในบางกรณีการ Normalize เกินไปทำให้ Query ต้อง Join หลายตาราง การ Denormalization หรือการเก็บข้อมูลซ้ำบ้าง จะช่วยให้ Query เร็วขึ้น
ตัวอย่างแบบ Normalize
SELECT u.name, o.total FROM users u JOIN orders o ON u.id = o.user_id WHERE u.id = 1;
ตัวอย่างแบบ Denormalize (เก็บชื่อผู้ใช้ใน orders)
CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT, user_name TEXT, -- Denormalized field total NUMERIC );
5. การใช้ Materialized View
สำหรับ Query ที่ซับซ้อน สามารถใช้ Materialized View
เก็บผลลัพธ์ล่วงหน้า แล้ว Refresh ตามรอบเวลาแทน
CREATE MATERIALIZED VIEW top_customers AS SELECT user_id, SUM(total) AS total_spent FROM orders GROUP BY user_id; REFRESH MATERIALIZED VIEW top_customers;
6. Best Practices
- ใช้
EXPLAIN ANALYZE
ก่อน Optimize - สร้าง Index ให้ตรงกับ Query ที่ใช้บ่อย
- Rewrite Query ให้ง่ายและใช้ JOIN แทน Subquery เมื่อทำได้
- พิจารณา Denormalization เมื่อ JOIN มากเกินไป
- ใช้ Materialized View สำหรับ Query ซับซ้อน
สรุป
การ Optimize Query เป็นกระบวนการสำคัญที่ช่วยเพิ่ม Performance โดยสามารถใช้หลายวิธี เช่น Index Hint, Rewrite Query และ Denormalization การเลือกวิธีขึ้นอยู่กับ Use Case และลักษณะของข้อมูล หากทำอย่างเหมาะสมจะช่วยให้ระบบตอบสนองเร็วขึ้นและลดภาระของฐานข้อมูล
SEO Keywords
PostgreSQL Query Optimization,Postgres Index Hint,Rewrite Query PostgreSQL,Denormalization Database,Optimize Slow Query,PostgreSQL Performance Tuning,Postgres Materialized View