私は3つのテーブルを持っています:
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
には、せいぜい数十件のレコードしかありません。BigTable
数百万あり、実際には、このデータベースのテーブルを同じサーバー上の別のデータベースのテーブルと UNIONS するビューです。
結合ロジックは次のとおりです。
SELECT * FROM
SmallTable s
INNER JOIN JoinTable j ON j.SmallTableID = s.ID
INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
(s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
AND (s.flag2=1 OR b.text1 <> 'value1')
平均結合サイズは数千の結果です。表示されるものはすべて索引付けされています。
ほとんどのSmallTable
レコードでは、flag1
とflag2
が に設定されて1
いるため、BigTable.text1 のインデックスにアクセスする必要さえありませんが、SQL Server はアクセスするため、コストのかかるインデックス スキャンとネスト ループが発生します。
との両方が に設定されている場合flag1
、を気にする必要がないことを SQL Server に示唆するより良い方法はありますか?flag2
1
text1
実際、これらの場合に BigTable への結合を完全に回避できれば (JoinTable は管理されているため、問題は発生しません)、このキー クエリはさらに高速になります。