[MSSQL] การปรับ Query ที่มี Condition เป็น DataTime ให้ไวขึ้น(Query ด้วย DateTime แล้วช้า)

วู้วๆ ห่างหายจากการ Update Blog มานานมาก อีกไม่กี่เดือนใกล้ๆที่จะครบ 1 ปีพอดี ก็นะพอดีก่อนหน้ามี เรื่องงานก็ยุ่งๆ + กับช่วงสิ้นปีก็มีการเปลี่ยนแปลงในชีวิตที่ค่อนข้างซีเรียสอยู่ (เปลี่ยนงาน) ครับ การย้ายที่ทำงาน ก็เลยได้จับได้ทำอะไรที่ไม่เคยทำมาก่อน อย่าง Spring MVC, Windows App, Ext.js และก็มาเจอโปรเจคที่ใหญ่ขึ้น Data ที่มากขึ้น แหะๆ และก็เป็นที่มาของเรื่องที่จะเขียนบทความในวันนี้ เริ่มจากปัญหาเกิดขึ้นจากโปรแกรมต้องไป Query Data จาก View ที่มีการ Select ที่ซับซ้อน และ Union กัน 3 ตลบ เวลา Query จาก View ก็รอพอประมาณไม่ได้ช้าอะไรมากมาย แต่ประเด็นมันดันเกิดขึ้น เมื่อเวลา Query Condition ที่เป็น DateTime มันดันอืดผิดปกติ และยิ่งเวลาเอาไปใช้งานส่วนของ Web ที่ใช้ DataTable รับข้อมูลเข้ามาเป็น JSon มันต้องทำการ Query 2 รอบ รอบแรก Query เพื่อ Count หาจำนวน Record ทั้งหมด และรอบ 2 Query เอา Data จริงที่ทำการแบ่งหน้ามาแสดง โดยที่ DB เป็น MSSQL 2008R2 หุหุ ที่ทำให้เรื่องของการ Limit จำนวน Record ในหน้าลำบากขึ้นอีกหน่อยนึง ทำให้เวลาที่ DataTable ทำงานก็ต้องรอ execute Query ถึง 2 Query ซึ่งตก Query ละ 20-30 วิ ทำให้ผมจึงต้องหาวิธีเพื่อแก้ปัญหา

การ Query Data ทั้งหมดจาก View 

Query Data ทุก Record จาก View
Query Data ทุก Record จาก View

 

การ Query Data โดยใช้เงื่อนไข 1 วัน จาก View 

Query Data จาก View เงื่อนไขวันเดียว
Query Data จาก View เงื่อนไขวันเดียว

 

การ Query Data โดยใช้เงื่อนไขวันที่แบบ Range จาก View

Query Data จาก View เงื่อนไขวันที่แบบ Range
Query Data จาก View เงื่อนไขวันที่แบบ Range

** ข้อสังเกตุ ปัญหาของผมจะเห็นชัดๆ ตอน Query  โดยใช้เงื่อนไข 1 วัน

และผมก็ได้ลองหาข้อมูลใน อากู๋ เพื่อจะแก้ปัญหา Query ด้วย DataTime และช้าดู แล้วก็ไปเจอ Topic นึงเค้าแก้ปัญหาด้วยการ Declare ค่าวันที่ก่อนที่จะ Select ผมก็เลยสงสัยว่ามันจะช่วยได้จริงหรอฟระ ก็เลยลองดูซะ

Reference Topic

Reference Topic
Reference Topic

 

การ Query Data โดยใช้เงื่อนไข 1 วัน จาก View โดยมีการ Declare วันที่ก่อน Select

Query Data จาก View เงื่อนไขวันเดียว และ Declare วันที่ก่อน
Query Data จาก View เงื่อนไขวันเดียว และ Declare วันที่ก่อน

ซึ่งก็ได้ผลการทดสอบดังรูปเลยครัชชช เชดดดดด
จาก 35 วิ เหลือ 2 วิ แหะๆ

การ Query Data โดยใช้เงื่อนไขวันที่แบบ Range จาก View โดยมีการ Declare วันที่ก่อน Select

Query Data จาก View เงื่อนไขวันที่แบบ Range และ Declare วันที่ก่อน
Query Data จาก View เงื่อนไขวันที่แบบ Range และ Declare วันที่ก่อน

ซึ่งก็ได้ผลการทดสอบของเงื่อนไขวันที่แบบ Range ที่ไวขึ้นนิดนึง
จาก 6 วิ เหลือ 4 วิ แหะๆ

สรุป
– จากที่ผมทดสอบดูการ Declare ช่วยให้ Query ไวขึ้นจริง
– จะเห็นผลชัดเจนกับ Query  ที่ใช้เงื่อนไข 1 วัน

ผมไม่ได้บอกว่า วิธีนี้เป็นวิธีที่ดีที่สุด แต่เป็น Solution ที่ผมพอจะหามาเพื่อแก้ปัญหาจากงานที่ผมเจอ และอยากจะแชร์เผื่อจะเป็นประโยชน์กับคนที่เจอปัญหาเดียวกัน

สุดท้ายเป็นรูปเปรียบเทียบจากการ Query ที่ใช้ในงานของผม

ก่อน Declare

Query จำนวน Record จาก View เงื่อนไขวันเดียว
Query จำนวน Record จาก View เงื่อนไขวันเดียว

หลัง Declare

Query จำนวน Record จาก View เงื่อนไขวันเดียวและ Declare วันที่ก่อน
Query จำนวน Record จาก View เงื่อนไขวันเดียวและ Declare วันที่ก่อน

 

ก่อน Declare

Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไข 1 วัน
Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไข 1 วัน

หลัง Declare

Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไข 1 วัน และมีการ Declare วันที่
Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไข 1 วัน และมีการ Declare วันที่

 

ก่อน Declare

Query จำนวน Record จาก View เงื่อนไขวันที่แบบ Range
Query จำนวน Record จาก View เงื่อนไขวันที่แบบ Range

หลัง Declare

Query จำนวน Record จาก View เงื่อนไขวันที่แบบ Range และ Declare วันที่ก่อน
Query จำนวน Record จาก View เงื่อนไขวันที่แบบ Range และ Declare วันที่ก่อน

 

ก่อน Declare

Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไขวันที่แบบ Range
Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไขวันที่แบบ Range

หลัง Declare

Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไขวันที่แบบ Range และมีการ Declare วันที่
Query Data จาก View เพื่อแบ่งหน้า โดยเงื่อนไขวันที่แบบ Range และมีการ Declare วันที่