如何从视图查询时手动选择索引

时间:2016-08-19 09:47:57

标签: sql sql-server

我需要查询的视图,已经广泛用于生产并且不鼓励改变,被定义为

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来解决处理问题的方法,但我很好奇是否有解决方案直接应用于视图,因为视图非常复杂,以及我的选择列的关系。

1 个答案:

答案 0 :(得分:0)

SQL Server是执行表扫描还是非聚集索引RID取决于与“WHERE”条件匹配的行数。你不应该告诉SQL Server查询优化器该做什么,因为......它知道的更好。在您的情况下,表扫描可能比RID查找更快。请在引爆点上做一些reading