## การ Optimize Query Performance ใน PostgreSQL 16: 10 เทคนิคที่ต้องรู้ในปี 2026
สวัสดีครับทุกคน ผมเองก็เป็น Developer ไทยที่โค้ดมาได้สักพักหนึ่งแล้ว แต่ต้องบอกเลยว่าช่วงแรกๆ ผมก็เคยเจอเรื่อง Optimization Query ใน PostgreSQL เป็นประจำ แล้วก็เสียเวลาไปกับการ Debug อะไรที่ไม่น่าจะเกี่ยวกับการ Query เลยทีเดียว กว่าจะรู้ว่าปัญหาคือ Query เองจริงๆ ก็ต้องเสียเวลาไปกับการลองผิดลองถูกเยอะมาก ซึ่งมันไม่สนุกเลยจริงๆ ครับ ปี 2026 นี้ผมได้ลองศึกษาเทคนิคต่างๆ จาก Medium, Dev.to และ Hacker News มาพอสมควร แล้วอยากมาแชร์ให้เพื่อนๆ Dev คนอื่นๆ ที่อาจจะเจอปัญหาเดียวกัน หรืออยากจะพัฒนาประสิทธิภาพของ Database ของตัวเองให้ดีขึ้นด้วยครับ
### การ Indexing ที่ใช่ – ไม่ใช่แค่ Index ที่เยอะ
ก่อนอื่นเลย ผมคิดว่าเรื่อง Indexing เป็นหัวใจสำคัญของการ Optimize Query จริงๆ ครับ หลายคนอาจจะคิดว่า “ใส่ Index เยอะๆ ก็ดี” แต่มันไม่ใช่เสมอไป เพราะการใส่ Index ที่ไม่เหมาะสมก็เหมือนใส่เสื้อโค้ทหนาๆ ในวันที่อากาศร้อน มันจะทำให้ Database ทำงานช้าลงด้วยซ้ำไป
จริงๆ แล้ว PostgreSQL 16 มี Index หลายประเภทให้เลือกใช้ ผมลองศึกษาแล้วพบว่า Index Type ที่สำคัญและน่าสนใจเป็นพิเศษในปี 2026 คือ:
* **B-Tree Index:** อันนี้คือ Index ที่ใช้กันทั่วไป ใช้ได้ดีกับ Query ที่ใช้ `WHERE` clause ที่ใช้ Operator `=` หรือ `>` หรือ `<`
* **GIN Index:** เหมาะกับการค้นหาข้อมูลที่มีความซับซ้อน เช่น JSONB หรือ arrays เพราะจะช่วยให้ Query สามารถค้นหาข้อมูลภายในโครงสร้างเหล่านั้นได้เร็วขึ้นครับ
* **GiST Index:** คล้ายกับ GIN Index แต่จะเหมาะกับการค้นหาข้อมูลที่ใช้ Algorithm ที่หลากหลาย เช่น geography data
* **BRIN Index:** เหมาะกับ Data ที่มีการเรียงลำดับของค่า Column นั้นอย่างชัดเจน เช่น ID ที่เรียงตามลำดับเวลา
**ตัวอย่าง:** สมมติว่าเรามี Table ชื่อ `users` มี Column ชื่อ `id` และ `name` เราอยาก Query หา User ที่มี `name` เป็น “สมชาย” เราควรสร้าง Index แบบไหน?
ผมคิดว่าในกรณีนี้ B-Tree Index น่าจะเป็นตัวเลือกที่ดีที่สุดครับ เพราะเราใช้ `=` กับ `name` column
sql
CREATE INDEX idx_users_name ON users (name);
**Cost:** ฟรี (ใช้ทรัพยากร CPU และ Disk Space ในการสร้าง Index)
**เหมาะกับ:** ทุก application ที่มีการ Query Table `users` โดยใช้ `name` column เป็นหลัก
**Internal Link:** ปรับปรุง PostgreSQL 16 บน Ubuntu 26: Indexing Strategy เพิ่มประสิทธิผล
### JSONB Performance: SQL Queries in Milliseconds – 2026
PostgreSQL 16 มีการปรับปรุงประสิทธิภาพของ JSONB มากขึ้นอย่างเห็นได้ชัดครับ เพราะ JSONB เป็น Data Type ที่นิยมใช้มากๆ ในปัจจุบัน (โดยเฉพาะใน Microservices) การ Query JSONB ที่ไม่ถูกวิธีจะทำให้ Query ช้ามากๆ ครับ
เทคนิคที่ผมเจอมาคือ:
1. **ใช้ JSONB Operators:** PostgreSQL มี Operators ที่ออกแบบมาสำหรับ JSONB โดยเฉพาะ เช่น `->`, `->>`, `#>` ซึ่งจะช่วยให้ Query สามารถเข้าถึงและจัดการข้อมูลใน JSONB ได้อย่างมีประสิทธิภาพ
2. **ใช้ GIN Index:** ถ้า Query JSONB บ่อยๆ การสร้าง GIN Index จะช่วยให้ Query เร็วขึ้นได้มาก
3. **หลีกเลี่ยงการใช้ `jsonb_array_elements()`:** การใช้ฟังก์ชันนี้จะทำให้ Query ช้าลง เพราะต้อง Convert JSON Array เป็น Rows ซึ่งไม่จำเป็นเสมอไป
**ตัวอย่าง:** สมมติว่าเรามี JSONB data ชื่อ `user_data` ดังนี้:
json
{
"id": 123,
"name": "สมชาย",
"address": {
"street": "สุขุมวิท",
"city": "กรุงเทพ"
}
}
เราอยาก Query หา City ที่ User นี้อยู่
sql
SELECT data -> 'address' ->> 'city' AS city
FROM (SELECT jsonb_build_object('id', 123, 'name', 'สมชาย', 'address', jsonb_build_object('street', 'สุขุมวิท', 'city', 'กรุงเทพ')) AS data) AS test;
**Cost:** ฟรี (ใช้ทรัพยากร CPU และ Disk Space ในการสร้าง Index หรือ Query)
**เหมาะกับ:** ทุก Application ที่ใช้ JSONB data เป็นหลัก
**Internal Link:** JSONB Performance: SQL Queries in Milliseconds - 2026
### Query Plan Analysis และ `EXPLAIN` – เพื่อนที่ดีที่สุดของคุณ
เทคนิคที่สำคัญที่สุดอย่างหนึ่งในการ Optimize Query คือการทำความเข้าใจ Query Plan ของ PostgreSQL ครับ `EXPLAIN` command จะช่วยให้เราเห็นว่า PostgreSQL จะ Query Table ของเราอย่างไร และมีขั้นตอนอะไรบ้าง
ผมคิดว่าหลายคนมองข้าม `EXPLAIN` ไป ทำให้ไม่รู้ว่า Query ช้าเพราะอะไร ผมเลยแนะนำว่าทุกคนควรทำความคุ้นเคยกับ `EXPLAIN` command และใช้มันเพื่อวิเคราะห์ Query ของตัวเองอยู่เสมอ
**ตัวอย่าง:**
sql
EXPLAIN SELECT * FROM users WHERE name = 'สมชาย';
Output ของ `EXPLAIN` จะแสดงให้เห็นว่า PostgreSQL จะใช้ Index อะไร, จะ Scan Table อย่างไร, และมีขั้นตอนอะไรบ้าง
**Cost:** ฟรี (ใช้ทรัพยากร CPU ในการวิเคราะห์ Query Plan)
**เหมาะกับ:** ทุก Developer ที่อยาก Optimize Query ให้มีประสิทธิภาพ
### การปรับแต่ง Parameter ของ PostgreSQL – อย่าปล่อยให้เป็นค่า default
PostgreSQL มี Parameter หลายตัวที่สามารถปรับแต่งได้เพื่อเพิ่มประสิทธิภาพในการทำงานของ Database ครับ ตัวอย่างเช่น:
* `shared_buffers`: Memory ที่ PostgreSQL ใช้เก็บ Data และ Index
* `work_mem`: Memory ที่ PostgreSQL ใช้สำหรับ Sort และ Hash operations
* `effective_cache_size`: Memory ที่ PostgreSQL ใช้ในการคาดการณ์ Data ที่จะถูก Query
ผมคิดว่าการปรับแต่ง Parameter เหล่านี้ให้เหมาะสมกับ workload ของ Application ของเรา จะช่วยให้ Query เร็วขึ้นได้มาก
**Cost:** ฟรี (ใช้ทรัพยากร CPU และ Disk Space ในการปรับแต่ง Parameter)
**เหมาะกับ:** Database Administrator และ Developer ที่มีความเข้าใจเกี่ยวกับ Database performance
### Bonus Tips: Vacuum และ Analyze – อย่าลืมดูแล Database ของคุณ
การทำ `VACUUM` และ `ANALYZE` เป็นสิ่งที่ขาดไม่ได้ในการดูแล Database ของเราครับ `VACUUM` จะช่วยทำความสะอาด Table โดยการลบ Rows ที่ถูก Delete หรือ Update แล้ว `ANALYZE` จะช่วยอัปเดต Statistics ที่ PostgreSQL ใช้ในการ Plan Query
**Cost:** ฟรี (ใช้ทรัพยากร CPU และ Disk Space ในการทำ Vacuum และ Analyze)
**เหมาะกับ:** ทุก Developer ที่ต้องการให้ Database ทำงานได้อย่างราบรื่น
---
**FAQ**
1. **ผมควรเริ่มจากการ Optimize Query แบบไหนก่อนครับ?** ผมแนะนำให้เริ่มจากการทำ `EXPLAIN` กับ Query ที่ช้าที่สุดก่อน แล้วค่อยๆ ทำความเข้าใจ Query Plan และปรับ Index ให้เหมาะสมครับ
2. **ถ้าผมไม่รู้ว่าควรสร้าง Index อะไรดีครับ?** ลองดู Column ที่ถูกใช้ใน `WHERE` clause บ่อยๆ หรือ Column ที่มีการใช้ Filter ที่ซับซ้อนครับ
---
ผมอยากทราบว่าเพื่อนๆ Dev ที่อ่านบทความนี้แล้ว เคยเจอปัญหาแบบนี้บ้างมั้ยครับ หรือมีเทคนิคอื่นๆ ที่อยากจะแชร์ให้ผมและเพื่อนๆ Developer คนอื่นๆ ด้วยครับ
Optimize PostgreSQL 16: 10 เทคนิคเร่ง Query ปี 2026
byBoonyadol Morruchai (Senior Full-stack Developer)
•
0