Posted by: siamnobita | 03/28/2009

Tuning for Beginners

จริง ๆ แล้ว ผมเพิ่งมีโอกาสทำงาน tuning จริงจัง แค่ประมาณสามปีเท่านั้นเอง ครั้งแรกที่ทำก็ไม่ได้มั่นใจอะไรมากมาย แต่ก็สร้างผลงานได้น่าประทับใจไม่น้อย จากประสบการณ์ครั้งนั้นไม่นาน ก็มีหลายคนเรียกผมเป็น tuning specialyst (โปรแกรมที่ผมแก้มันรันเร็วขึ้น 80-95%) อันที่จริงมันก็ไม่ใช่ฝีมือของผมซะทีเดียว ต้องขอบคุณโปรแกรมเมอร์คนแรกที่เขียนให้มันรันได้ช้าขนาดนั้นต่างหาก (โปรแกรมนั้นฝรั่งเขียนด้วยนะ อีกครั้งที่ขอยืนยันว่า คนไทยไม่แพ้ชาติใดในโลก :))

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

พวกเรามักจะถามหาสูตรสำเร็จของการ tuning ซึ่งในความเป็นจริงนั้น ไม่มีสูตรสำเร็จที่ตายตัว ยืนยันโดยคำกล่าวของ Tom Kyte เจ้าพ่อแห่งวงการนี้ ว่าถ้าสรุปเป็นขั้นตอนตายตัวได้ ต่อให้มีเป็นแสนเป็นล้านขั้นตอน คงกลายเป็น software สำเร็จรูปราคาแพงไปเรียบร้อยแล้ว

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

  1. It is a matter of knowing all of the available access paths and when to use them and how to make them available. เราต้องรู้จักและเข้าใจ access paths หรือวิธีการที่ฐานข้อมูลใช้ในการเข้าถึงข้อมูลที่เราต้องการ oracle มี access path หลากหลายเราต้องเข้าใจทั้งหมดและรู้ว่าแบบไหนเหมาะสมกับสถานการณ์แบบไหน และเราจะทำอย่างไร เมื่อ oracle เกิดปัญหาในการเลือก access path ที่เหมาะสมให้กับเรา
  2. It is a matter of knowing the question. ก่อนลงมือ tune query ใดเราต้องทำความเข้าใจวัตถุประสงค์ของคนเขียน query นั้นเสียก่อน ข้อนี้สำคัญต่อให้ query ที่เราแก้ไข ทำงานเร็วขึ้นเป็นร้อยเท่าแต่ได้คำตอบแตกต่างออกไปจากที่ต้องการ มันก็ไม่มีประโยชน์อะไร นอกจากนั้นข้อแตกต่างเล็ก ๆ น้อย ๆ ระหว่าง query 2 query จะเกิดขึ้นกับความเป็นไปได้ของข้อมูลบางชุดเท่านั้น เราต้องเข้าใจถึงลักษณะของข้อมูลที่เรามีอยู่ด้วย
  3. It is a matter of knowing all of the available bits of functionality. เราต้องเรียนรู้ความสามารถใหม่ ๆ ของฐานข้อมูลอยู่ตลอดเวลา ตัวอย่างเช่น analytic functions ซึ่งอยู่ในฐานข้อมูล oracle ตั้งแต่เวอร์ชั่น 8.1.7 จนบัดนี้ oracle ออก 11g มาแล้ว ผมว่ามีผู้ใช้งาน oracle ไม่ถึง 10% ที่รู้จักและนำมาใช้ประโยชน์ (อันนี้ ผมว่าสาเหตุหลักคือหลักสูตร SQL ที่ oracle จัดไม่ค่อย update เท่าที่ควรคนที่ผ่านการอบรม หรือต่อให้สอบ cert ได้แล้ว ส่วนใหญ่ใช้งานความสามารถของ oracle ได้ยังไม่ถึง 10% เลย)
  4. Mastering all aspects of the SQL language. เราต้องสร้างความชำนาญในการใช้ภาษา SQL ยกตัวอย่างคุณ Tom เจ้าของบทความ โจทย์ที่คนทั่วไปต้องเขียน code ยาวเป็นหน้า ๆ แกมองปราดเดียว ตอบคำถามได้ด้วยคำสั่ง SQL แค่ประโยคเดียว แถมนึกได้หลาย solutions แยกตามแต่ละเวอร์ชั่นของ oracle อีกต่างหาก
  5. Being prepared to throw out every existing “rule of thumb” you have. เตรียมตัวเตรียมใจที่จะโยนความรู้เก่า ๆ ที่เคยได้ยินมาทิ้งให้หมด อย่างที่บอกการ tuning ไม่มีกฏเกณฑ์ตายตัว เราต้องอาศัยความรู้ที่เอ่ยถึงในข้อก่อน ๆ บวกด้วยจินตนาการความคิด พิสูจน์ทฤษฎีต่าง ๆ ด้วยการทดสอบจริง กฏทุกกฏมักมีข้อยกเว้นเสมอ
  6. Thinking about what the machine might have to do in order to process your query. คิดเหมือนที่ฐานข้อมูลคิด ไม่ได้หมายถึงเราต้องทำตัวเป็นเครื่องคอมพิวเตอร์ แต่เราต้องสนใจด้วยว่า ทุก query ที่เราสั่งไป เกิด process อะไรเบื้องหลัง ก่อนที่เราจะได้ผลลัพธ์ออกมา ผมเคยเรียนหลักสูตร RDBMS กับอาจารย์ท่านหนึ่ง แกบอกว่าการใช้ภาษา SQL เราสนใจแค่เราต้องการอะไรก็พอ ส่วนจะได้มาอย่างไรนั้นเป็นเรื่องของ RDBMS ก็คงจริงสำหรับโปรแกรมเมอร์ธรรมดา ๆ ทั่วไปครับ แต่ไม่พอสำหรับจะเป็น tuning specialyst แน่

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

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


ใส่ความเห็น

หมวดหมู่