Ketika saya melihat rencana ekseksi aktual dari beberapa pertanyaan saya, saya perhatikan bahwa konstanta literal yang digunakan dalam klausa WHERE muncul sebagai rantai bersarang untuk penghitungan skalar dan pemindaian konstan .
Untuk mereproduksi ini, saya menggunakan tabel berikut
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
Dengan beberapa data di dalamnya:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
Ketika saya menjalankan kueri (omong kosong) berikut:
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
Saya melihat bahwa itu akan melakukan menggambar Nested Loop di hasil Index Seek dan perhitungan skalar (dari konstanta).
Perhatikan bahwa literal lebih besar dari maxint. Memang membantu menulis CAST(2147483648 as BIGINT)
. Tahu mengapa MSSQL membelokkan itu ke rencana eksekusi dan apakah ada cara yang lebih pendek untuk menghindarinya daripada menggunakan para pemain? Apakah itu mempengaruhi parameter terikat untuk pernyataan yang disiapkan (dari jtds JDBC) juga?
Perhitungan skalar tidak selalu dilakukan (tampaknya indeks pencarian spesifik). Dan kadang-kadang penganalisis permintaan tidak menunjukkannya secara grafis tetapi seperti col1 < scalar(expr1000)
dalam properti predikat.
Saya telah melihat ini dengan MS SSMS 2016 (13.0.16100.1) dan SQL Server 2014 Expres Edition 64bit pada Windows 7, tapi saya rasa ini adalah perilaku umum.