Posted by: siamnobita | 06/09/2009

SQL Tuning

จากสถิติของบล๊อก ผมพบว่าหลายคนหลงเข้ามาที่นี่จากการค้นหาคำว่า sql tuning แสดงว่ามีคนสนใจในด้านนี้อยู่พอสมควรทีเดียว น่าเสียดาย ที่เขาต้องกลับไปมือเปล่า เพราะผมยังไม่ได้เขียนอะไรเป็นชิ้นเป็นอันเกี่ยวกับการ tuning เลย (ขออภัยเป็นอย่างยิ่ง แหะ ๆ)

เอาเป็นว่า วันนี้ผมจะเล่าสู่กันฟังเกี่ยวกับเทคนิคการ tuning ที่ผมเคยใช้มานะครับ แต่ขอออกตัวก่อนว่า ผมไม่เคยทำงานในตำแหน่ง DBA ซึ่งเป็นตำแหน่งที่น่าจะมีโอกาสได้ทำงาน tuning ค่อนข้างมาก เพียงแค่ผมชอบทางด้านนี้ เพื่อน ๆ น้อง ๆ รวมถึงคนรู้จักทั้งหลาย ก็เลยมาใช้บริการกันบ่อย ๆ (ฟรีด้วย ฮึ่ม) ซึ่งก็ยังเป็นเพียงประสบการณ์น้อยนิดเท่านั้น ยอมรับว่ายังเป็นกบในกะลาอยู่มาก ๆ

อันดับแรก เมื่อผมได้ sql ที่ต้องการ tune มา เกือบครึ่งหนึ่งแค่ดู sql ก็รู้ปัญหาเลย เนื่องจากข้อผิดพลาดอยู่ที่วิธีการเขียน เช่น

  • การเรียกใช้ stored function ที่เขียนขึ้นเอง โดยไม่จำเป็น
  • การ access ตารางเดียวกันหลาย ๆ ครั้ง ซึ่งผมพบว่าใช้ analytic functions แทนได้
  • การใช้ not in โดยไม่คำนึงกรณีค่า null ที่อาจ return ได้จาก subquery
  • การใช้ function ครอบ column ที่มี index รวมถึงการแปลงชนิดของข้อมูลแบบไม่ตั้งใจด้วย
  • การใช้ outer join โดยไม่จำเป็น
  • การใช้ view อย่างฟุ่มเฟือยเกินเหตุ
  • อื่น ๆ ที่ผมยังนึกไม่ออกตอนนี้

ส่วนที่เหลือนอกจากนั้น แสดงว่า sql ดูเป็นปกติดี จุดแรกที่ผมจะตรวจสอบคือ มีการเก็บ stats เอาไว้หรือยัง และยังทันสมัยอยู่หรือไม่ ถ้าไม่ก็ดำเนินการเสียให้เรียบร้อย แล้วรันดูอีกครั้ง ดูความเปลี่ยนแปลง ถ้า stats โอเคอยู่แล้ว ก็ถึงเวลาไล่ execution plan

จาก execution plan ผมจะมองหา step ที่น่าจะเป็นปัญหา เช่น full scan table, nested loop join, sort operation โดยศึกษาประกอบกับข้อมูลจริง เมื่อเจอตัวปัญหาแล้วก็ต้องพยายามเปลี่ยน plan ด้วยวิธีการต่าง ๆ นานา เช่น re-write query รวมถึงการใช้ hints

ด้วยวิธีการต่าง ๆ นี้ ผมแก้ปัญหาที่เคยเจอมาได้เกือบทั้งหมด ผมไม่ค่อยอยากพึ่ง tools ประเภท tuning advisor สักเท่าไหร่ เพราะ tools พวกนี้ชอบลัดขั้นตอนไป step สุดท้ายเลย และผมคิดว่าผลลัพธ์ที่ได้มักจะยังไม่ดีถึงที่สุด

วันนี้ เกริ่นสั้น ๆ แต่เพียงเท่านี้ ครั้งหน้าจะยกตัวอย่างปัญหาที่เกิดจากวิธีเขียนมาให้เห็นกันชัด ๆ ทีละปัญหา ขอบคุณที่ติดตามล่วงหน้าครับ

ด้วยจิตคารวะ


Responses

  1. ขอบคุณครับ


ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

หมวดหมู่

%d bloggers like this: