いいえ、サブクエリを評価した後、この矛盾を動的に検出しません。がインデックス化されていて、プランが範囲シークを示している場合big_table_column1
、大きな違いはありませんが、そうでない場合は、クエリを分割して を使用することで最適化できますOPTION (RECOMPILE)
。
結合されたクエリは、大きなテーブルのフル スキャンを実行します。
2 つに分割することで、大きなテーブルにまったく触れないようにすることができます (コンスタント スキャンは、ステートメントが再コンパイルされたときに矛盾が検出されたことを示します)。
CREATE TABLE big_table
(
big_table_column1 INT
)
INSERT INTO big_table
SELECT TOP 1000000 v1.number
FROM master..spt_values v1,
master..spt_values v2
CREATE TABLE another_table
(
another_table_column1 INT
)
INSERT INTO another_table
VALUES (200000000)
/*Query 1*/
SELECT *
FROM big_table
WHERE big_table_column1 > (SELECT MAX(another_table_column1)
FROM another_table)
AND big_table_column1 < 100000000
OPTION (RECOMPILE)
/*Query 2*/
DECLARE @another_table_column1 INT
SELECT @another_table_column1 = MAX(another_table_column1)
FROM another_table
SELECT *
FROM big_table
WHERE big_table_column1 > @another_table_column1
AND big_table_column1 < 100000000
OPTION (RECOMPILE)
DROP TABLE big_table, another_table