一部のクエリの実際の実行計画を見ると、WHERE句で使用されているリテラル定数が、スカラー計算と定数スキャンのネストされたチェーンとして表示されていることに気づきました。
これを再現するには、次の表を使用します
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
その中にいくつかのデータがあります:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
次の(ナンセンス)クエリを実行すると:
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
インデックスシークとスカラー計算(定数から)の結果で、ネストされたループの描画を行うことがわかります。
リテラルがmaxintよりも大きいことに注意してください。それは書くのに役立ちますCAST(2147483648 as BIGINT)
。MSSQLがそれを実行計画に委ねている理由は何ですか?キャストを使用するよりも回避するためのより短い方法はありますか?(jtds JDBCからの)準備されたステートメントにバインドされたパラメーターにも影響しますか?
スカラー計算は常に行われるわけではありません(インデックスシーク固有のようです)。また、クエリアナライザーはそれをグラフィカルに表示せずcol1 < scalar(expr1000)
、述語プロパティのように表示する場合があります。
Windows 7のMS SSMS 2016(13.0.16100.1)とSQL Server 2014 Expres Edition 64ビットでこれを見たことがありますが、これは一般的な動作だと思います。