有办法吗?我目前面临问题,因为在我的查询中不必要地使用了一个索引(如sql server 2008中查询的执行计划中所示),并且它降低了查询性能。无法删除此索引,因为它对某些其他查询很有用。
答案 0 :(得分:2)
使用hints指示优化器使用特定索引甚至(来自链接)
如果要强制进行表扫描,请使用提示:(INDEX(0))。
答案 1 :(得分:2)
我认为这里唯一的选择实际上是强制SQL Server使用某些特定的执行计划。为此,您需要先“创建”此计划。尝试使用空数据库/重新计算统计信息/查询和表提示,以获得所需的计划。之后,您应该保存计划并将其应用于您的查询。您可以阅读有关如何执行此操作的详细说明here和here。
答案 2 :(得分:1)
您可以为SQL Server提供查询提示,例如强迫它使用特定的索引 - 但据我所知,没有办法阻止它使用特定的索引。你能找到一些你的查询可以使用的其他索引吗?
此外,在SQL Server 2008中,您还有新的其他查询提示,称为OPTIMIZE FOR
,这可能有助于您为查询优化器定义(和解释)它应优化的内容。
有关完整的详细信息,请参阅MSDN documentation on query hints。
这是添加索引时必须进行的典型和基本权衡 - 是的,它可能会提高您正在查看的一个查询的性能 - 但与此同时,它可能会降低其他查询。这里真的没有简单的解决方案 - 其他查询的收益大于此查询的痛苦 - 然后保留索引。否则放弃它。
答案 3 :(得分:1)
不确定这是否仍然有效,但在过去,围绕列名称包装函数通常会停止任何索引使用,例如
where substring(mycol,1,16) = ?
答案 4 :(得分:1)
除非绝对必要,否则查询提示应 避免 (并且大部分时间都不需要提示)。使用一个会回来咬你...
我建议您重建索引或更新统计信息。
答案 5 :(得分:0)
我知道这是一个古老的问题,但对于那些偶然发现这个问题的人(像我一样),有一种方法可以防止使用索引,尽管它有点迂回。
您需要告诉SQL不使用任何索引,然后确切地告诉它可以使用哪些索引。
基本上你最终会得到一个白色的索引列表。
FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex))
此处有更多信息:http://msdn.microsoft.com/en-us/library/ms187373.aspx