如何强制查询不使用给定表上的索引?

时间:2012-06-13 14:23:13

标签: sql sql-server-2005 indexing

我目前正在进行一些测试,以确定在SQL Server 2005中为某个列包含索引的性能影响。

我使用的测试数据集大约有大约7200万行(大约6 GB的数据)。为了实际测试索引的性能,我需要能够比较有和没有索引的性能。

这一切都很好,但首先创建一个索引并不是一个便宜的操作。如果我想在没有索引的情况下测试表,我至少需要禁用索引。要使用索引进行测试,我需要重新启用它,这需要相当长的时间。

有什么办法可以强制SQL Server 2005在执行查询时忽略给定的索引?我不想仅仅为了测试查询而禁用索引,因为它需要很长时间来禁用索引。

3 个答案:

答案 0 :(得分:52)

SELECT *
FROM MyTable WITH (INDEX(0))
WHERE MyIndexedColumn = 0

查询通常会使用MyIndexedColumn上的索引,但由于表提示,它将代替表扫描。


SELECT *
FROM MyTable WITH (INDEX(IndexName))
WHERE MyIndexedColumn = 0

查询通常会使用MyIndexedColumn上的索引,但由于表提示,它将使用名为IndexName的索引。

答案 1 :(得分:8)

我正在使用所有不同类型的数据库,并且在我需要它时永远不会记住具体的提示。因此,我使用的是一种纯SQL方法,它目前适用于所有跨越我的方式的数据库。

这个想法只是让DB不可能通过混淆SQL中的相应表达式来使用特定的索引。 E.g。

SELECT *
  FROM MyTable
 WHERE MyIndexedColumn + 0 = 0

同样,您可以将空字符串添加到字符串值。当前优化器无法解决此类表达式无法在(MyIndexedColumn)上使用索引。

这实际上是我在书中描述的反模式。以下是关于math in SQL

的页面

它对于临时测试来说已经足够好了。在生产代码中,提示更具表现力!

答案 2 :(得分:-3)

您可以在运行测试代码的同一事务中禁用您不想使用的索引,只需确保在最后回滚事务。这可以确保测试代码不会使用索引,但会阻止索引实际被禁用。

BEGIN TRANSACTION

    ALTER INDEX [MyIndex] ON MyTable DISABLE;

    EXEC TestCode;

ROLLBACK

如果你遇到一个复杂的情况,你的测试代码会在不同的时间使用多个索引,并且你想测试是否添加一个新的索引会改善一些东西。