Tôi chỉ cần xác nhận rằng tôi hiểu một cái gì đó chính xác:
Gần đây tôi đã xem một câu hỏi SO trong đó một người dùng đã đăng câu trả lời trong Linq như:
from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p
Đối với những người không quen thuộc với Linq, tôi hy vọng đầu ra của tuyên bố đó (không được kiểm tra một cách công bằng) là:
SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE()
Tôi đã đăng một câu trả lời cho câu nói này rằng thao tác datetime phải nằm trên biến (trong trường hợp này GETDATE()
) vì vậy trên thực tế, câu lệnh sẽ phản ánh một cái gì đó như:
SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())
Trong phần trả lời của tôi, các bit tôi hiện không chắc chắn, giả sử như sau:
- Chỉ mục sẽ không được sử dụng do thao tác của cột
- Các kế hoạch truy vấn sẽ khác nhau một phần vì ở trên (không được kiểm tra, giả sử như vậy)
- Vì những điều trên, truy vấn thứ 1 sẽ thực sự hoạt động kém hơn truy vấn thứ 2.
Câu hỏi của tôi:
Tôi đã bỏ lỡ bất cứ điều gì trong lý luận của tôi? Tôi có đúng không? Cuối cùng, có ai có bài viết hay nào về SARGability không?