我有一个要调整的SQL select查询。在查询中有一个View in from子句,它通过4个表形成。执行此查询时,所有这4个表都会发生全表扫描,从而导致CPU峰值。这四个表都有基于它们构建的有效索引。
查询与此类似:
SELECT DISTINCT ID, TITLE,......
FROM FINDSCHEDULEDTESTCASE
WHERE STEP_PASS_INDEX = 1 AND LOWER(COMPAREANAME) ='abc' ORDER BY ID;
点表示还有更多列。这里FINDSCHEDULEDTESTCASE是四个表的视图。
有人可以指导我如何避免在这四张桌子上进行全表扫描。
答案 0 :(得分:2)
无论如何使用你的条件
AND LOWER(COMPAREANAME) ='abc'
您将完全扫描COMPAREANAME值,因为必须计算每个值函数LOWER。
答案 1 :(得分:1)
这取决于很多东西!
SELECT DISTINCTG ID, TITLE, ......
根据您选择的列数,SQL Server可能决定执行表扫描而不是使用索引。
此外,根据您的“WHERE”条件,SQL Server还可以决定执行表扫描而不是使用索引。
您使用的是哪个版本的SQL Server?
如果,例如,“WHERE”中的条件表示行数少于50%,并且您使用的是SQL 2008,则可以采用一些方法来改进表上的索引。(使用过滤的索引{ {3}})
或者您可以在视图(http://msdn.microsoft.com/en-us/library/ms188783.aspx)
上创建索引你的问题中确实没有足够的细节能够真正帮助你。