Khi tôi nhìn vào kế hoạch thực tế của một số truy vấn của tôi, tôi nhận thấy rằng các hằng số được sử dụng trong mệnh đề WHERE hiển thị dưới dạng một chuỗi tính toán vô hướng lồng nhau và quét liên tục .
Để tái tạo điều này, tôi sử dụng bảng sau
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
Với một số dữ liệu trong đó:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
Khi tôi chạy truy vấn (vô nghĩa) sau:
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
Tôi thấy rằng nó sẽ thực hiện một bản vẽ Nested Loop trong kết quả của Index Seek và phép tính vô hướng (từ một hằng số).
Lưu ý rằng nghĩa đen lớn hơn maxint. Nó giúp để viết CAST(2147483648 as BIGINT)
. Bất cứ ý tưởng nào tại sao MSSQL lại làm chệch hướng kế hoạch thực hiện đó và có cách nào ngắn hơn để tránh nó hơn là sử dụng diễn viên không? Nó có ảnh hưởng đến các tham số bị ràng buộc với các câu lệnh được chuẩn bị (từ JDBC của jtds không) không?
Việc tính toán vô hướng không phải lúc nào cũng được thực hiện (dường như là chỉ số tìm kiếm cụ thể). Và đôi khi bộ phân tích truy vấn không hiển thị bằng đồ họa mà như col1 < scalar(expr1000)
trong các thuộc tính vị ngữ.
Tôi đã thấy điều này với MS SSMS 2016 (13.0.16100.1) và SQL Server 2014 Expres Edition 64bit trên Windows 7, nhưng tôi đoán đó là một hành vi chung.