避免全表扫描

时间:2012-07-04 16:05:16

标签: sql

我有一个要调整的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是四个表的视图。

有人可以指导我如何避免在这四张桌子上进行全表扫描。

2 个答案:

答案 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

上创建索引

你的问题中确实没有足够的细节能够真正帮助你。