我对以下查询的性能有疑问:
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%)。