我目前正在进行一些测试,以确定在SQL Server 2005中为某个列包含索引的性能影响。
我使用的测试数据集大约有大约7200万行(大约6 GB的数据)。为了实际测试索引的性能,我需要能够比较有和没有索引的性能。
这一切都很好,但首先创建一个索引并不是一个便宜的操作。如果我想在没有索引的情况下测试表,我至少需要禁用索引。要使用索引进行测试,我需要重新启用它,这需要相当长的时间。
有什么办法可以强制SQL Server 2005在执行查询时忽略给定的索引?我不想仅仅为了测试查询而禁用索引,因为它需要很长时间来禁用索引。
答案 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
如果你遇到一个复杂的情况,你的测试代码会在不同的时间使用多个索引,并且你想测试是否添加一个新的索引会改善一些东西。