Wenn ich mir den tatsächlichen Exektionsplan einiger meiner Abfragen ansehe, stelle ich fest, dass Literalkonstanten, die in einer WHERE-Klausel verwendet werden, als verschachtelte Kette aus skalarem und konstantem Scan angezeigt werden .
Um dies zu reproduzieren, verwende ich die folgende Tabelle
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
Mit einigen Daten:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
Wenn ich die folgende (Unsinn-) Abfrage ausführe:
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
Ich sehe, dass es eine Nested-Loop-Zeichnung im Ergebnis von Index Seek und einer Skalarberechnung (von einer Konstanten) macht.
Beachten Sie, dass das Literal größer als maxint ist. Es hilft zu schreiben CAST(2147483648 as BIGINT)
. Gibt es eine Idee, warum MSSQL dies auf den Ausführungsplan verzögert, und gibt es einen kürzeren Weg, dies zu vermeiden, als die Besetzung zu verwenden? Beeinflusst es auch gebundene Parameter für vorbereitete Anweisungen (von jtds JDBC)?
Die Skalarberechnung wird nicht immer durchgeführt (scheint index-suchspezifisch zu sein). Und manchmal zeigt der Abfrageanalysator es nicht grafisch an, sondern wie col1 < scalar(expr1000)
in den Prädikateigenschaften.
Ich habe dies mit MS SSMS 2016 (13.0.16100.1) und SQL Server 2014 Expres Edition 64bit unter Windows 7 gesehen, aber ich denke, es ist ein allgemeines Verhalten.