次のクエリのパフォーマンスについて質問があります。
DECLARE @detail_level INT = 1,
@DETAIL_1 INT = 1,
@DETAIL_2 INT = 2,
@DETAIL_3 INT = 4
SELECT mtbl.*,
CASE
WHEN @detail_level & @DETAIL_1 <> 0 THEN tbl_1.value
ELSE NULL
END,
CASE
WHEN @detail_level & @DETAIL_2 <> 0 THEN tbl_2.value
ELSE NULL
END,
CASE
WHEN @detail_level & @DETAIL_3 <> 0 THEN tbl_3.value
ELSE NULL
END
FROM mtbl
LEFT OUTER JOIN tbl_1
ON @detail_level & @DETAIL_1 <> 0
AND mtbl.KEY = tbl_1.KEY
LEFT OUTER JOIN tbl_2
ON @detail_level & @DETAIL_2 <> 0
AND mtbl.KEY = tbl_2.KEY
LEFT OUTER JOIN tbl_3
ON @detail_level & @DETAIL_3 <> 0
AND mtbl.KEY = tbl_3.KEY
WHERE mtbl.KEY = @something
クエリエンジンは、詳細レベルフィルタを使用してクエリを最適化し、これらの詳細テーブル列に対する不要なテーブル結合と不要なテーブル行アクセスを回避しますか?
はいの場合、クエリエンジンはそれらの不要なテーブルのインデックスロックを取得しませんか?
SQL Server 2008でクエリプランをキャプチャしましたが、詳細レベルが一致していなくても、インデックス検索操作はまだ存在していました。ただし、詳細が少ないクエリは、詳細が完全なクエリ(データ量が約500,000)よりも高速でした(約30%)。