Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Việc gói các cột nullable trong ISNULL có gây ra việc quét bảng không?

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 




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zero SQL bế tắc theo thiết kế - bất kỳ mẫu mã nào?

  2. Vòng qua một tập bản ghi trong SQL Server

  3. Làm cách nào để tạo danh sách được phân tách bằng dấu phẩy bằng truy vấn SQL?

  4. Đếm số cột không rỗng trong mỗi hàng

  5. Bắt buộc người dùng viết mã đầu tiên luôn khởi tạo cơ sở dữ liệu không tồn tại?