いくつかのIN
句を含む SQL クエリがあります。クエリ プランのキャッシュを改善するために、テーブル値パラメーターを使用することにしました。これがサンプルWHERE ID IN (SELECT ID FROM @P1)
です。@P1 は次の型の変数です:
CREATE TYPE [dbo].[Ids] AS TABLE(
[ID] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
しかし、一部のクエリが遅くなることに気付きました。クエリの例は次のとおりです。
select * from SomeTable s where ((s.SomeForeignId in (select id from @p1)) or s.SomeForeignId is null)
私のデータベースで2.1秒で実行されます。
そして古いクエリ:
select * from SomeTable s where ((s.SomeForeignId in (1,2,3.....)) or s.SomeForeignId is null)
1.8秒で実行します。
クエリプランの違いに気付きました。最初のクエリのプランは 2 つの部分 (null チェック用と in 句用) で構成され、連結が続きます。2番目の計画は単なるインデックスシークです。
パラメータ化されたクエリを改善して実行速度を上げる方法はありますか?
PS これは抽出されたクエリのサンプルにすぎません。このin (select id from @p1)
部分に誤りがあるかどうかを知りたいです。