2013-01-24 31 views
8

Tôi có một số biến số ngày mà tôi muốn so sánh với cột ngày giờ (ngày gửi).Hiệu suất Datediff

Im hiện đang làm điều này:

DECLARE @RunDate datetime = '2013-01-01' 
DECALRE @CalculationInterval int = 10 

DELETE 
FROM TableA 
WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

Vì vậy, về cơ bản bất cứ điều gì đó là cũ sau đó 10 ngày nên được xóa, chúng tôi có Index trên cột sendDate nhưng vẫn là tốc độ chậm hơn nhiều, tôi biết ở phía bên trái nên không có tính toán cho các lý do hiệu suất, nhưng cách tối ưu để giải quyết vấn đề này là gì?

+0

làm cách nào để đặt truy vấn "SARGable" trong trường hợp đó? –

Trả lời

12

Khái niệm

WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

sẽ không thể sử dụng một chỉ mục trên cột senddate, vì các chức năng trên LHS trên senddate

Để thực hiện mệnh đề WHERE 'SARGable' (ví dụ: có thể sử dụng chỉ mục), thay đổi thành điều kiện tương đương:

WHERE senddate < dateadd(dd, [email protected], @RunDate) 

[Xin cảm ơn @Krystian Lieber, vì đã chỉ ra incorr ect condition].

+0

1 cho sargable – WKordos

+1

Tôi nghĩ tình trạng này nên ĐÂU senddate dateadd (đ, @CalculationInterval, @RunDate) cho @ RunDate = '2013-01-11' và @ CalculationInterval = 10, chúng tôi xóa tất cả các hàng có ngày gửi> '2013-01-21' khi tôi nghĩ rằng chúng tôi muốn xóa tất cả các hàng có ngày gửi <'2013-01-01' –

+0

@Krystian Lieber - Đúng là tôi đã thực hiện thay đổi đó, tôi chỉ muốn có một ý tưởng làm thế nào để làm cho nó trở nên sargable :) –