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

Mik*_*ley 41 sql indexing sql-server-2005

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

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

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

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

Amy*_*y B 60

SELECT *
FROM MyTable WITH (INDEX(0))
WHERE MyIndexedColumn = 0
Run Code Online (Sandbox Code Playgroud)

查询通常会使用MyIndexedColumn上的索引,但由于表提示,它将改为表扫描.


SELECT *
FROM MyTable WITH (INDEX(IndexName))
WHERE MyIndexedColumn = 0
Run Code Online (Sandbox Code Playgroud)

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

  • 我意识到我参加这个聚会迟到了,但这确实没有回答 OP 的问题,即使他“接受”了答案。正如 Satyajit 指出的那样,这个例子展示了如何使用不同的索引,而不是如何强制 SQL 不使用特定的索引,如果表上还有其他索引,优化器可能会放弃使用这些索引中的任何一个,我不想弄清楚我应该使用 WITH 包含哪些其他索引。我在下面赞成 Markus Winand 的回答,IMO 实际上回答了 OP 的问题。 (2认同)

Mar*_*and 8

我正在使用所有不同类型的DB,并且在我需要它时永远不会记住具体的提示.因此,我正在使用纯SQL方法(当前)与所有跨越我的方式的DB一起使用.

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

SELECT *
  FROM MyTable
 WHERE MyIndexedColumn + 0 = 0
Run Code Online (Sandbox Code Playgroud)

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

这实际上是我在书中描述的反模式.以下是关于SQL中数学的一些信息

它对于临时测试来说确实足够好.在生产代码中,提示更具表现力!