Như ypercube đã nhận xét
Không, nếu truy vấn là những gì bạn thể hiện, anh ấy hoàn toàn sai. Nó là khá lớn như nó là.
Bạn có thể xác minh điều này bằng cách:
- Tạo bảng thử nghiệm đơn giản với cột [Ngày].
- Chèn một số lượng lớn các hàng với ngày khác nhau.
- LƯU Ý: Trong "số lượng lớn" và "ngày thay đổi" ở trên là một biện pháp phòng ngừa để đảm bảo rằng truy vấn của bạn đủ chọn lọc . Nếu không, trình tối ưu hóa có thể chọn không sử dụng chỉ mục của bạn trong mọi trường hợp.
- Tạo kế hoạch truy vấn cho truy vấn của bạn (một lần với chỉ mục trên cột Ngày và một lần không có).
- Bạn cũng có thể sử dụng IO STATISTICS để thể hiện sự khác biệt.
- Nếu bạn có đủ dữ liệu thử nghiệm, sự khác biệt sẽ dễ dàng quan sát được.
Khi bạn đã có bằng chứng, tôi khuyên bạn nên đưa nó lên với DBA. Tuy nhiên, đừng tranh cãi. Chỉ cần hiển thị kiểm tra và dữ liệu chứng minh chỉ số được sử dụng.
Vấn đề là bạn không muốn bị buộc phải cúi người về phía sau để tránh những vấn đề không tồn tại.
May mắn thay trong trường hợp bạn chứng minh, sẽ không có vấn đề gì khi di chuyển các chức năng bên ngoài truy vấn. Ví dụ
DECLARE @FromDate date ='inputdate',
@ToDate date = DATEADD(day, 1, @FromDate)
Trong thực tế, những điều trên thậm chí có thể được duy trì nhiều hơn trong thời gian dài.
Tuy nhiên, sẽ đến lúc bạn có thứ gì đó không thể thay đổi một cách tầm thường theo mong muốn của DBA. Nhu la:
--Granted this probably belongs in a JOIN clause, but is primarily for illustrative purposes.
--Also the issue of sargability applies just as much to JOIN clauses as WHERE clauses
WHERE a.date >= b.date
AND a.date < DATEADD(day, 1, b.date)
Cách duy nhất để đưa hàm này ra khỏi mệnh đề WHERE là tính toán trước một cột khác b.NextDay
. Đó chính xác là lý do tại sao bạn cần DBA để hiểu chính xác Sargability. Tức là ở trên:
- Sẽ có thể tận dụng một chỉ số trên
a.date
.
- Nhưng không thể tận dụng một chỉ số trên
b.date
.
- Vì vậy, cột / chỉ mục được chọn nhiều nhất không nên có chức năng được áp dụng, nhưng cái khác có thể.
- Cố gắng hack một giải pháp mà không có chức năng trong mệnh đề WHERE sẽ làm giảm cả khả năng bảo trì và hiệu suất.
Nếu bạn thực sự không thể mua được từ DBA, có lẽ những điều sau đây sẽ hoạt động và bỏ qua các quy tắc tôn sùng hàng hóa của họ:
;WITH CTE_B AS (
SELECT b.Date, DATEADD(day, 1, b.DATE) AS NextDay
FROM b
)
SELECT ...
WHERE a.Date >= CTE_B.Date
AND a.Date < CTE_B.NextDay
Trình tối ưu hóa gần như chắc chắn sẽ tối ưu hóa điều này theo cách tương tự như khi hàm nằm trong WHERE
mệnh đề, vì vậy bạn không nên gõ hiệu suất. Nhưng đó chắc chắn là một sự giảm bớt không cần thiết trong khả năng bảo trì.
BETWEEN
với ngày nhưng đó là một vấn đề khác, không liên quan) Bạn chỉ hiển thị cho chúng tôi một truy vấn. Nếu bạn có hàng chục truy vấn với các điều kiện không thể thực hiện được và các lệnh gọi hàm, chúng có thể đã bỏ lỡ một truy vấn thực sự có thể thực hiện được.