Kế hoạch thực hiện là tuyệt vời nhưng đôi khi họ không nói cho bạn sự thật. Vì vậy, đây là một bằng chứng dựa trên kiểm tra hiệu suất.
(và dòng dưới cùng - biểu thức không được đánh giá cho mỗi hàng)
;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 hàng bị ảnh hưởng)
Đây là truy vấn OP và mất khoảng 12 giây để chạy
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Truy vấn này lưu trữ ngày trong một tham số trước khi thực hiện, mất khoảng thời gian tương tự, 12 giây.
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
Và chỉ để xác minh kết quả -
Truy vấn này thực hiện tính toán trên col1 và do đó phải tính toán lại biểu thức cho mỗi hàng mất khoảng 30 giây để chạy.
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
Tất cả các truy vấn được thực hiện liên tục hiển thị về cùng một số liệu
GETDATE()
.