กฎ 21 ข้อเพื่อการ Query ข้อมูลให้รวดเร็วขึ้น (ตอนที่ 1)

27-ก.ค.-17

คัมภีร์เทพ IT


        สิ่งที่ขาดไม่ได้ของการสืบค้นข้อมูล (Query) ใน Database คือ “ความรวดเร็ว” ซึ่งทั้งคนไอทีที่ทำหน้าที่โดยตรงอย่าง SQL Developer และ DBA เองก็ได้พยายามทำให้การสืบค้นข้อมูลรวดเร็วที่สุดเท่าที่จะทำได้อยู่แล้ว แต่น่าเสียดายว่า เราไม่สามารถแก้ไขหรือทำทุกอย่างให้ออกผลลัพธ์มาได้อย่างสมบูรณ์แบบด้วยวิธีการเดียวได้ กฎ 21 ข้อที่จะช่วยให้ฐานข้อมูลของคุณเร็วและมีประสิทธิภาพยิ่งขึ้นมีอะไรบ้าง มาดูกัน!  (บทความนี้จะแบ่งเป็น 2 ตอน ซึ่งในตอนแรกนี้จะขอนำเสนอกฎ 10 ข้อ)

 

  1. หลีกเลี่ยงการใช้เคอร์เซอร์ (Cursor)
    คนไอทีคงจะทราบกันดีว่า เมื่อไรที่มีการใช้ Cursor นั่นหมายถึง ต้องมีการรอคำสั่งว่าจะให้ทำอะไร ซึ่งแน่นอนว่ามันมีผลต่อความเร็ว อีกทั้งยังเป็นสาเหตุของการ Block การทำงานอื่นๆ โดยไม่จำเป็นด้วย (เพราะต้องรอคำสั่งจาก Cursor นี่แหละ)

     
  2. หากเลี่ยงข้อ 1 ไม่ได้ ให้ใช้ Temp Table
    หากคุณไม่สามารถเลี่ยงการใช้ Cursor ได้ ก็ควรสร้าง Temp Table แทนการใช้ข้อมูลจาก Table จริงๆ ซึ่งนอกจากจะมีขนาดเล็ก และสะดวกในการใช้งานแล้ว ยังใช้ Resource ของระบบแค่ชั่วคราวอีกด้วย

     
  3. ใช้ Temp Table อย่างฉลาด
    คุณสามารถใช้ Temp Table ในสถานการณ์อื่นๆ อีก เช่น คุณต้องการ Join Table หนึ่งกับอีก Table ที่ใหญ่มากๆ และต้องกำหนด Condition จากใน Table ใหญ่นั้นด้วย แนะนำว่าคุณควรดึงข้อมูลที่จะใช้มาจาก Table ใหญ่ มาใส่ Temp Table แล้วค่อย Joint กับ Table ที่ต้องการในภายหลัง จะช่วยทำให้มีประสิทธิภาพที่ดีกว่า นอกจากจะช่วยลดการใช้ resource แล้ว ยังเป็นการช่วยให้คุณทำงานสะดวกขึ้นหากมี Query อื่นๆ ใน Procedure ที่ต้องใช้การ Join Table เดียวกันนี้อีก

     
  4. เตรียมข้อมูลไว้ก่อน (Pre-Stage)
    ถือเป็นเทคนิคเก่าที่หลายๆ คนมักมองข้าม หากคุณมี Report หรือ Procedure ที่ต้อง Join Table แบบเดียวกัน คุณควรจะจัดเตรียมข้อมูลไว้ก่อน (Pre-Stage) โดยการ Join Table เตรียมไว้ล่วงหน้า จะได้ไม่ต้อง Join Table ขนาดใหญ่ บางคนอาจมองว่าเทคนิคนี้ไม่มีความจำเป็น แต่ถ้าคุณต้องการใช้ข้อมูลเหล่านั้นบ่อยๆ ทำไมเราถึงไม่ทำให้มันง่ายต่อการใช้งานและประหยัด resource ของระบบล่ะ จริงไหม

     
  5. หลีกเลี่ยงการใช้ Nested View
    การใช้ View มีข้อดีคือ ช่วยแสดงให้เห็นข้อมูลเท่าที่ต้องการ แต่หากคุณใช้ View ซ้อนใน View และซ้อนไปเรื่อยๆ (Nested View) จะยิ่งทำให้ Database ยิ่งช้าลง เพราะข้อมูลจะถูก Query ซ้อนกันไปเรื่อยๆ หรือในเคสร้ายแรงสุดคือ ระบบอาจจะไม่แสดงผลอะไรออกมาเลยก็ได้เพราะทำงานหนักเกินไป หากคุณลดการใช้ Nested View ได้จะลดเวลาจากหน่วยนาที ลงเหลือแค่หน่วยวินาทีเลยทีเดียว

     
  6. ใช้ CASE แทนการใช้ UPDATE
    สมมติ คุณต้องการนำข้อมูลลูกค้าทั้งหมดจาก Table Customer มาใส่ Temp Table โดยที่ถ้าลูกค้าคนไหนมียอดสั่งซื้อเกิน $100,000 ขึ้นไป ให้ใส่ Label ของลูกค้าเหล่านั้นในเป็น “Preferred” ปกติถ้าไม่คิดซับซ้อนมาก ขั้นแรกเราจะ INSERT ข้อมูลทั้งหมดจาก Table Customer ลงใน Temp Table ก่อน แล้วขั้นตอนถัดมา ค่อย UPDATE ข้อมูล Label ให้เป็น Preferred สำหรับลูกค้าที่มียอดสั่งซื้อเกิน $100,000 แต่นั่นทำให้คุณต้องใช้ถึง 2 ขั้นตอนในการทำให้เสร็จ มันมีเทคนิคที่ง่ายกว่านั้นคือ การใช้ CASE ตั้งแต่ในขั้นตอน Insert แทนที่จะมาทำการ UPDATE ทีหลัง เพราะเมื่อใช้ CASE แล้ว คุณจะสามารถเลือกลูกค้าโดยที่เงื่อนไขข้างต้นมาก่อนที่จะ INSERT ใน Temp Table ได้เลย ทำให้เหลือเพียง 1 ขั้นตอนเท่านั้น ซึ่งจะช่วยทำให้มีประสิทธิภาพที่ดีกว่า

     
  7. ใช้ Table-valued Function แทนการใช้ Scalar
    สำหรับหัวข้อนี้ถือเป็น Tip ที่น่าสนใจ คือ เมื่อคุณใช้ Scalar Function ในการ SELECT ข้อมูล คุณสามารถเพิ่มประสิทธิภาพได้โดยการแปลงไปเป็น Table-valued Function และใช้ CROSS APPLY ในการ Query การทำเช่นนี้สามารถลดจำนวนการ Query ลงได้ครึ่งหนึ่งเลย

     
  8. ใช้ Partitions ใน SQL Server
    ผู้ที่ใช้ SQL Server Enterprise สามารถใช้ประโยชน์จาก Feature “Automatic Partition” เพื่อเพิ่มประสิทธิภาพความเร็วให้มากขึ้น ใน SQL Server แม้แต่ Table จะถูกสร้างขึ้นเป็น Partition เดียว ซึ่งคุณสามารถแบ่งออกเป็นหลายๆ ส่วนได้  ดังนั้น เมื่อคุณต้องการย้ายข้อมูลจำนวนมากระหว่าง Table คุณสามารถใช้คำสั่ง SWITCH แทน INSERT และ DELETE เนื่องจากคุณกำลังเปลี่ยน metadata สำหรับ Table เดียวแทนการ DELETE และ INSERT ข้อมูลที่มีจำนวนมากระหว่าง Table จะใช้เวลาเพียงไม่กี่วินาทีในการทำงาน

     
  9. DELETE และ UPDATE เป็น Batch ใหญ่ๆ
    การ DELETE และ UPDATE ข้อมูลที่มีปริมาณมหาศาล (Batch ใหญ่ๆ) ใน Table น่าจะถือเป็น “ฝันร้าย” ของคนไอทีหลายๆ คน ปัญหาคือทั้ง 2 คำสั่งถูก Run เป็น Transaction เดียว ถ้าคุณต้องการ Kill Process หรือมีปัญหาอะไรเกิดขึ้นระหว่างการ Run ก็ตาม ระบบจะ Roll back ทั้ง Transaction นั่นหมายถึง ต้องใช้เวลานานกว่าเสร็จ ในขณะเดียวกันมันจะไปปิดกั้นการทำงานของ Transaction อื่นๆ ด้วย ทางแก้ไข ก็คือ ควร DELETE และ UPDATE ที่เป็น Batch เล็กๆ จะดีกว่าเพราะหากเกิดปัญหาแล้วต้อง Roll back จะใช้เวลาน้อยกว่า ทำให้ฐานข้อมูลกลับมาใช้งานได้รวดเร็วกว่า

     
  10. ทุกอย่างต้องใช้เวลา
    Developer บางคนต้องมา “ติดแหง็ก” กับคำสั่ง DELETE และ UPDATE ในข้อ 9 อยู่นานแสนนาน เพียงหวังว่ามันจะทำเสร็จภายในวันเดียว คำตอบคือ มันอาจจะไม่ได้เป็นแบบนั้นเสมอไป ถ้ามันจำเป็นต้องรอ คุณก็ควรขยายเวลารอผลออกไป แต่การทำเป็น Batch เล็กๆ จะช่วยให้คุณไม่รู้สึกว่าต้องรอนานๆ ถ้ามีปัญหาขึ้นมาก็ลดการเกิดระบบ Down อีกด้วย

 

ติดตามอีก 11 ข้อที่เหลือได้ในตอนที่ 2 คลิกที่นี่

 

 ที่มาinfoworld.com/
 

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

 

เพิ่มเพื่อน

 

 

 

บทความที่เกี่ยวข้อง