我需要查询的视图,已经广泛用于生产并且不鼓励改变,被定义为
CREATE VIEW v AS
SELECT ... FROM table A
-- The view has no index,
--The table A has clustered index on col1,
--non-clustered index id=2 on col1 include col2, col3,
--non-clustered index id=3 on (col2,col1) include col4
INNER JOIN ........
我的查询是
SELECT a.something, b.something FROM v a
--I choose something from b, so not possible to change INNER JOIN to EXISTS
INNER JOIN OtherTable b ON a.col2=b.col2
WHERE v.col1 IN (SELECT value FROM somewhere)
可能是由于JOIN条件,优化器在查询时选择索引id = 3并导致整个表选择。但是当硬编码WHERE条件时,它正确选择索引id = 2并使预期的实际扫描次数:
WHERE v.col1 IN('a','b',...)
但是,由于我查询视图,因此无法强制选择特定的表索引。
我知道通过退出使用视图或使用UNION ALL
来解决处理问题的方法,但我很好奇是否有解决方案直接应用于视图,因为视图非常复杂,以及我的选择列的关系。
答案 0 :(得分:0)
SQL Server是执行表扫描还是非聚集索引RID取决于与“WHERE”条件匹配的行数。你不应该告诉SQL Server查询优化器该做什么,因为......它知道的更好。在您的情况下,表扫描可能比RID查找更快。请在引爆点上做一些reading。