แผนการดำเนินการนั้นยอดเยี่ยม แต่บางครั้งพวกเขาก็ไม่ได้บอกความจริงกับคุณ ดังนั้นนี่คือหลักฐานตามการทดสอบประสิทธิภาพ
(และบรรทัดล่าง - นิพจน์ไม่ได้รับการประเมินสำหรับทุกแถว)
;with t(i) as (select 0 union all select i+1 from t where i < 9)
select getdate()-1 as col1,getdate() as col2,getdate() as col3
into #t
from t t0,t t1,t t2,t t3,t t4,t t5,t t6,t t7
(100000000 แถวที่ได้รับผลกระทบ)
นี่คือแบบสอบถาม OP และใช้เวลาประมาณ 12 วินาทีในการทำงาน
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
แบบสอบถามนี้ซึ่งเก็บวันที่ในพารามิเตอร์ก่อนการดำเนินการจะใช้เวลาประมาณ 12 วินาที
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
และเพื่อยืนยันผลลัพธ์ -
เคียวรีนี้ทำการคำนวณบน col1 และดังนั้นจึงต้องคำนวณนิพจน์สำหรับทุกแถวใช้เวลาประมาณ 30 วินาทีในการรัน
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
การค้นหาทั้งหมดจะถูกดำเนินการซ้ำ ๆ โดยแสดงเกี่ยวกับการวัดเดียวกัน
GETDATE()
ดังนี้