Có, nó gây ra quét bảng. (mặc dù dường như được tối ưu hóa nếu cột không thực sự là nullable)
SR0007 quy tắc là lời khuyên cực kỳ tồi tệ vì nó làm cho vị từ không thể phân tích được và có nghĩa là bất kỳ chỉ mục nào trên cột sẽ vô dụng. Ngay cả khi không có chỉ mục nào trên cột, nó vẫn có thể làm cho các ước tính về số lượng không chính xác ảnh hưởng đến các phần khác của kế hoạch.
Việc phân loại nó trong Microsoft.Performance
danh mục khá thú vị vì nó dường như được viết bởi một người không hiểu gì về hiệu suất truy vấn.
Nó tuyên bố cơ sở lý luận là
Trong khi bản thân biểu thức đánh giá thành unknown
mã của bạn trả về một kết quả hoàn toàn xác định khi bạn hiểu rằng bất kỳ =
nào , <>
, >
, <
vv so sánh với NULL
đánh giá là Unknown
và rằng WHERE
mệnh đề chỉ trả về các hàng trong đó biểu thức được đánh giá là true
.
Có thể ý của chúng là nếu ANSI_NULLS
đã tắt nhưng ví dụ mà họ đưa ra trong tài liệu của WHERE ISNULL([c2],0) > 2;
so với WHERE [c2] > 2;
sẽ không bị ảnh hưởng bởi cài đặt này. Cài đặt này
Các kế hoạch thực thi hiển thị quét so với tìm kiếm hoặc bên dưới
CREATE TABLE #foo
(
x INT NULL UNIQUE
)
INSERT INTO #foo
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM sys.all_columns
SELECT *
FROM #foo
WHERE ISNULL(x, 10) = 10
SELECT *
FROM #foo
WHERE x = 10
SELECT *
FROM #foo
WHERE x = 10
OR x IS NULL