DuckDB: SQL Analytics บนเครื่อง (Python) - วิเคราะห์ข้อมูล 10 ล้านแถว!

DuckDB: รัน SQL วิเคราะห์ข้อมูล 10 ล้านแถวบนเครื่องตัวเองได้เลย ไม่ต้องมี server ใช้คู่กับ Python ได้ทันที เป็น tool ที่ Data Engineer

ผมเคยเจอสถานการณ์แบบนี้บ่อยๆ ในโปรเจกต์ Data Engineering ที่ผมทำให้กับบริษัท e-commerce ในปี 2026 บริษัทมีข้อมูล transaction ขนาดมหาศาล – ประมาณ 10 ล้านรายการ – เก็บไว้ในฐานข้อมูล PostgreSQL ที่ run อยู่บน cloud เราต้องการสร้าง dashboard ที่แสดงแนวโน้มยอดขาย, segmented ตามลูกค้า, และวัดผล effectiveness ของ campaign marketing แต่การ query ข้อมูลขนาดใหญ่แบบนี้บน cloud มันช้ามาก แถมยังต้องคิดค่าบริการอีกต่างหาก กว่าจะได้ผลลัพธ์ที่ใช้ได้จริงก็ใช้เวลานานเกินไป จนทีมต้องเจอดราม่าเรื่อง timeline และ budget ผมเองก็รู้สึกว่ามันไม่ efficient เลย

ปัญหาหลักคือการ dependency กับ infrastructure ที่ซับซ้อน การ query ข้อมูลขนาดใหญ่บน cloud นั้นกินทรัพยากรเยอะ และค่าใช้จ่ายก็สูงกว่าการประมวลผลบนเครื่องตัวเองเยอะมาก การใช้ DuckDB เข้ามาช่วยแก้ปัญหาตรงนี้ได้ดีมาก เพราะมันออกแบบมาเพื่อการวิเคราะห์ข้อมูลแบบ SQL บนไฟล์ data ขนาดใหญ่โดยเฉพาะ และยังสามารถ integrate กับ Python ได้อย่างราบรื่น ทำให้เราสามารถจัดการข้อมูลได้ง่ายขึ้นและรวดเร็วขึ้น

Introduction to DuckDB

black flat screen tv showing game
Photo by Martin Sanchez on Unsplash

DuckDB เป็นใน-memory SQL database engine ที่เน้นความเร็วและความสะดวกในการใช้งาน มันถูกออกแบบมาให้ run ได้โดยตรงบนเครื่องของคุณ โดยไม่ต้องมี server ที่ซับซ้อน ทำให้เราสามารถ query ข้อมูลขนาดใหญ่ได้แบบ real-time และยังสามารถใช้ Python ร่วมด้วยได้ทันที DuckDB version ที่ผมใช้ในตัวอย่างนี้คือ 2026.2.3

Setting Up DuckDB with Python

  1. Prerequisites: Python 3.11 หรือสูงกว่า, pip
  2. Install DuckDB: `pip install duckdb`

import duckdb

# Connect to DuckDB
con = duckdb.connect('my_data.duckdb')

# Execute a SQL query
result = con.execute("SELECT * FROM my_data LIMIT 10").fetchall()

# Print the result
print(result)

# Close the connection
con.close()
  

อธิบาย: ในตัวอย่างนี้ เราใช้ `duckdb.connect()` เพื่อเชื่อมต่อกับฐานข้อมูล DuckDB ชื่อ `my_data.duckdb` ถ้าไฟล์นี้ไม่มีอยู่ เราสามารถสร้างมันขึ้นมาได้ด้วยคำสั่ง `duckdb.connect('my_data.duckdb')` `con.execute()` ใช้ในการ run SQL query และ `.fetchall()` ใช้ในการดึงผลลัพธ์ทั้งหมดออกมา สุดท้าย `con.close()` ใช้ในการปิดการเชื่อมต่อ

Example Query and Output

graphs of performance analytics on a laptop screen
Photo by Luke Chesser on Unsplash

สมมติว่าเรามีไฟล์ CSV ชื่อ `sales_data.csv` ที่มีข้อมูล transaction ของบริษัทเรา เราสามารถ import data เข้ามาใน DuckDB ได้ดังนี้


import duckdb

con = duckdb.connect('sales_data.csv')
con.execute("CREATE TABLE sales_data FROM @filename")
result = con.execute("SELECT * FROM sales_data WHERE region = 'Asia' AND amount > 100").fetchall()
print(result)
con.close()
  

อธิบาย: `CREATE TABLE sales_data FROM @filename` เป็นการสร้างตารางชื่อ `sales_data` โดยใช้ข้อมูลจากไฟล์ `sales_data.csv` ที่เรา import เข้ามา `SELECT * FROM sales_data WHERE region = 'Asia' AND amount > 100` เป็นการ query ข้อมูล transaction ที่อยู่ใน region 'Asia' และมีมูลค่ามากกว่า 100 Output ที่ได้จะเป็น list ของ tuples ที่ตรงตามเงื่อนไขที่เรากำหนด

Error Handling and Troubleshooting

การใช้งาน DuckDB อาจมีปัญหาบ้าง เช่น syntax error ใน SQL query, data type mismatch, หรือปัญหาเกี่ยวกับ file path ผมเคยเจอ error ที่พบบ่อยคือ `SyntaxError` ซึ่งมักเกิดจากการพิมพ์ SQL query ผิด วิธีแก้คือตรวจสอบ syntax ของ query อย่างละเอียด และใช้ auto-completion ของ DuckDB ช่วยในการเขียน อีกอย่างคือ `FileNotFoundError` ซึ่งมักเกิดจากการที่ไฟล์ data ไม่ถูกวางไว้ในตำแหน่งที่ DuckDB สามารถเข้าถึงได้ ตรวจสอบให้แน่ใจว่าไฟล์ data อยู่ในตำแหน่งที่ถูกต้อง หรือระบุ path ของไฟล์ data ให้ถูกต้องใน query

What to Watch Out For / Common Pitfalls

จริงๆ ผมไม่ค่อยชอบวิธีนี้เพราะ DuckDB เหมาะกับการ query ข้อมูลขนาดค่อนข้างใหญ่ แต่ถ้าข้อมูลมีขนาดเล็กมากๆ การใช้ DuckDB อาจจะไม่คุ้มค่า เพราะ overhead ของการเริ่มต้น engine และการ load data อาจจะทำให้ query ช้ากว่าการใช้ SQL database engine แบบดั้งเดิม นอกจากนี้ DuckDB เป็น in-memory database engine ดังนั้น ถ้าข้อมูลมีขนาดใหญ่เกินกว่า RAM ของเครื่อง ข้อมูลจะถูก swap ไปยัง disk ซึ่งจะทำให้ query ช้าลงอย่างมาก ดังนั้น เราควรเลือกใช้ DuckDB กับข้อมูลที่มีขนาดเหมาะสม และควร monitor usage ของ RAM อย่างสม่ำเสมอ

Conclusion and Next Steps

DuckDB เป็น tool ที่ทรงพลังและใช้งานง่ายมากสำหรับ Data Engineers ที่ต้องการวิเคราะห์ข้อมูลขนาดใหญ่บนเครื่องตัวเอง ผมใช้ DuckDB ในหลายโปรเจกต์แล้ว และมันช่วยลดเวลาในการ query ข้อมูลได้อย่างมาก สำหรับขั้นตอนต่อไป ผมแนะนำให้ลองใช้ DuckDB กับข้อมูลของคุณเอง แล้วลอง integrate กับ Python workflow ของคุณดู ถ้าคุณสนใจเรื่อง data analysis และ SQL ผมแนะนำให้ศึกษาเพิ่มเติมเกี่ยวกับ DuckDB และ SQL และลองทำ project เล็กๆ น้อยๆ เพื่อฝึกฝน ถ้าคุณอยากลอง integrate DuckDB กับ Python workflow ของคุณ ลองดู Run Ollama AI Locally with PHP - No OpenAI Needed! หรือ LLPhant vs php-llm: เลือก Library LLM ที่ใช่สำหรับ PHP! เพื่อสร้าง pipeline ที่เชื่อมต่อ DuckDB กับ AI models ได้อย่างราบรื่น สุดท้าย ผมอยากจะเน้นย้ำว่า DuckDB เป็น tool ที่ดีมากสำหรับ Data Engineer ที่ต้องการเพิ่มประสิทธิภาพในการทำงานและลดต้นทุนในการวิเคราะห์ข้อมูล

คำถาม

คำถาม: DuckDB เหมาะกับข้อมูลขนาดเท่าไหร่?

คำตอบ: DuckDB เหมาะกับข้อมูลที่มีขนาดไม่เกิน 10 GB โดยประมาณ แต่สามารถ handle ข้อมูลที่มีขนาดใหญ่กว่านั้นได้ ถ้าข้อมูลมีขนาดใหญ่กว่า 10 GB อาจจะต้องใช้เทคนิคการ partition หรือ sampling เพื่อให้ query เร็วขึ้น

คำถาม: DuckDB มีข้อจำกัดอะไรบ้าง?

คำตอบ: DuckDB เป็น in-memory database engine ดังนั้นข้อมูลทั้งหมดจะถูกเก็บไว้ใน RAM ดังนั้นถ้าข้อมูลมีขนาดใหญ่เกินกว่า RAM ของเครื่อง ข้อมูลจะถูก swap ไปยัง disk ซึ่งจะทำให้ query ช้าลง นอกจากนี้ DuckDB ยังไม่รองรับ transaction ที่ซับซ้อนเหมือนกับ SQL database engine แบบดั้งเดิม

คำถาม: DuckDB สามารถ integrate กับ Python ได้อย่างไร?

คำตอบ: DuckDB สามารถ integrate กับ Python ได้อย่างง่ายดายโดยใช้ library `duckdb` ซึ่งสามารถ install ได้ผ่าน pip เราสามารถใช้ Python ร่วมกับ DuckDB เพื่อ import data, execute SQL query, และ visualize ผลลัพธ์

สินค้าแนะนำที่เกี่ยวข้อง

Sponsored · Lazada
Boonyadol Morruchai (Senior Full-stack Developer)

ผมเป็น IT Professional ที่มีประสบการณ์ในสายงานมากว่า 20 ปี เชี่ยวชาญการออกแบบระบบ Enterprise และ Automation Tools ปัจจุบันมุ่งเน้นการประยุกต์ใช้ AI (Gemini/OpenAI) เพื่อเพิ่มประสิทธิภาพในการเขียน Code และการจัดการข้อมูลขนาดใหญ่ บล็อกนี้สร้างขึ้นเพื่อแชร์ "ประสบการณ์หน้างาน" ปัญหาจริงที่เจอ และวิธีแก้ปัญหาฉบับ Senior Dev ครับ

แสดงความคิดเห็น

ใหม่กว่า เก่ากว่า