Nguồn có thẩm quyền <> và! = Giống nhau về hiệu suất trong SQL Server


74

Hãy xem xét câu trả lời này trên SO để trấn an người hỏi về <>toán tử rằng:

<>là ... giống như !=.

Nhưng sau đó, một người bình luận ống lên và nói:

Đúng là họ, về mặt chức năng, giống nhau. Tuy nhiên, cách trình tối ưu hóa SQL sử dụng chúng rất khác nhau. = /! = được đánh giá đơn giản là đúng / sai trong khi <> có nghĩa là động cơ phải xem và xem giá trị lớn hơn hoặc nhỏ hơn, có nghĩa là chi phí hiệu năng cao hơn. Chỉ cần một cái gì đó để xem xét khi viết các truy vấn có thể tốn kém.

Tôi tin rằng điều này là sai, nhưng để giải quyết những người hoài nghi tiềm năng, tôi tự hỏi liệu có ai có thể cung cấp một nguồn có thẩm quyền hoặc kinh điển để chứng minh rằng các toán tử này không chỉ giống nhau về mặt chức năng, mà giống hệt nhau về mọi mặt không?

Câu trả lời:


144

Trong quá trình phân tích cú pháp , SQL Server gọi sqllang!DecodeCompOpđể xác định loại toán tử so sánh có mặt:

Cuộc gọi ngăn xếp

Điều này xảy ra tốt trước khi bất cứ điều gì trong trình tối ưu hóa được tham gia.

Từ các toán tử so sánh (Transact-SQL)

Toán tử so sánh và ý nghĩa

Truy tìm mã bằng trình gỡ lỗi và ký hiệu công khai *, sqllang!DecodeCompOptrả về giá trị trong thanh ghi eax** như sau:

╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ <  ║    1 ║
║ =  ║    2 ║
║ <= ║    3 ║
║ !> ║    3 ║
║ >  ║    4 ║
║ <> ║    5 ║
║ != ║    5 ║
║ >= ║    6 ║
║ !< ║    6 ║
╚════╩══════╝

!=<>cả hai trả về 5, vì vậy không thể phân biệt trong tất cả các hoạt động sau này (bao gồm cả biên dịch & tối ưu hóa).


Mặc dù thứ yếu so với điểm trên, cũng có thể (ví dụ: sử dụng cờ theo dõi không có giấy tờ 8605) để xem cây logic được chuyển đến trình tối ưu hóa để xác nhận rằng cả hai !=<>ánh xạ tới ScaOp_Comp x_cmpNe(không so sánh toán tử vô hướng bằng nhau).

Ví dụ:

SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID != 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);

SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID <> 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);

cả hai sản xuất:

LogOp_Project QCOL: [P] .Sản phẩm
    Đăng nhập
        LogOp_Get TBL: Sản xuất .Sản phẩm (bí danh TBL: P)
        ScaOp_Comp x_cmpNe
            ScaOp_Identifier QCOL: [P] .Sản phẩm
            ScaOp_Const TI (int, ML = 4) XVAR (int, Không sở hữu, Giá trị = 4)
    AncOp_PrjList 

Chú thích

* Tôi sử dụng WinDbg ; các trình sửa lỗi khác có sẵn. Biểu tượng công khai có sẵn thông qua máy chủ biểu tượng Microsoft thông thường. Để biết thêm thông tin, hãy xem Tìm hiểu sâu hơn về SQL Server bằng cách sử dụng các nhóm nhỏ của Nhóm tư vấn khách hàng SQL Server và Gỡ lỗi máy chủ SQL với WinDbg - Giới thiệu của Klaus Aschenbrenner.

** Sử dụng EAX trên các dẫn xuất Intel 32 bit cho các giá trị trả về từ một hàm là phổ biến. Chắc chắn Win32 ABI làm theo cách đó và tôi khá chắc chắn rằng nó kế thừa thực tiễn đó từ thời MS-DOS cũ, nơi AX được sử dụng cho cùng mục đích - Michael Kjorling


58

Tôi làm việc tại Microsoft trong bộ phận Hỗ trợ SQL và tôi đã hỏi Jack Li, Kỹ sư nâng cao chuyên môn và Chuyên gia về vấn đề chủ đề về hiệu suất của SQL Server, "SQL có xử lý! = Khác với <> không?" và anh ta nói, "Họ giống nhau."


8

Tôi nghĩ rằng những điều sau đây chứng minh rằng <>không làm 2 so sánh.

  1. Tiêu chuẩn SQL 92 định nghĩa <>là không bằng toán tử, ( http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ). Về mặt kỹ thuật, !=là một phần mở rộng cho tiêu chuẩn (mặc dù tôi không thể nghĩ về bất kỳ RDBMS nào không triển khai nó).
  2. Nếu SQLServer được coi <>là 2 toán tử, không phải một toán tử, thì nó sẽ làm tương tự với ><lỗi thực tế là cú pháp.

1

Điều đó là không chính xác, Books Online (BOL) nói rằng chúng có chức năng giống nhau:

! = (Không bằng) (Giao dịch-SQL)

Và nếu bạn nhìn vào một kế hoạch thực hiện !=được sử dụng, theo Dự đoán, nó sẽ thay đổi != thành <>.


2
Vấn đề là ngôn ngữ "giống nhau về mặt chức năng" đã được thừa nhận trong nhận xét được tham chiếu, nhưng tạo ra sự khác biệt bổ sung về hiệu suất, mặc dù bạn và tôi biết rằng "giống nhau về mặt chức năng" bao gồm cách nó thực sự hoạt động và bất kỳ đặc điểm hiệu suất nào của chúng. Nếu một người định đi chứng minh điều này vượt ra ngoài mọi hoài nghi đã được xác định, thì người ta sẽ làm gì?
ErikE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.