54

我目前正在做一些测试,以确定在 SQL Server 2005 中的给定列上包含索引的性能影响。

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

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

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

4

3 回答 3

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

查询通常会使用 MyIndexedColumn 上的索引,但由于 table 提示,它将改为 tablescan。


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

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

于 2012-06-13T14:29:58.833 回答
9

我正在使用所有不同类型的数据库,并且在需要时永远记不起具体的提示。因此,我正在使用一种纯 SQL 方法,该方法(当前)适用于我遇到的所有数据库。

这个想法只是通过混淆 SQL 中的相应表达式,使 DB 无法使用特定索引。例如,当一个where子句使数据库相信它最好使用索引来解决时,但事实并非如此。

SELECT *
FROM MyTable
WHERE MyIndexedColumn + 0 = 0

同样,您可以将空字符串添加到字符串值。当前的优化器没有解决这样的表达式不能使用索引(MyIndexedColumn)

这实际上是我在书中描述的一种反模式。这里有一些关于SQL 数学的页面

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

于 2013-09-17T05:22:42.253 回答
-5

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

BEGIN TRANSACTION

    ALTER INDEX [MyIndex] ON MyTable DISABLE;

    EXEC TestCode;

ROLLBACK

如果您有一个复杂的情况,即您的测试代码在不同时间使用多个索引并且您想测试添加一个新索引是否会改善事情,这会更好。

于 2013-09-16T18:06:26.363 回答