2010-02-26 40 views
3

有办法做到这一点吗?我目前面临的问题是在我的查询中不必要地使用了一个索引(如sql server 2008中查询的执行计划中所示),并且降低了查询性能。该索引不能被删除,因为它对于其他查询很有用。如何停止使用特定查询的数据库索引?

+1

你怎么知道该指数是不必要的? – 2010-02-26 06:41:03

+0

正如我在下面的回答中提到的,在进入索引提示的高级领域之前,应该首先确保您的统计数据是最新的(或重建您的索引) – 2010-02-26 06:52:44

+0

我没有使用构建索引的字段。这就是为什么我认为在这种情况下索引是不必要的 – malay 2010-02-26 09:46:07

回答

1

您可以为SQL Server提供查询提示,例如,强迫它使用特定的索引 - 但据我所知,没有办法阻止它使用特定的索引。你能找到一些其他的索引来代替你的查询吗?

此外,在SQL Server 2008中,您还有新的附加查询提示,称为OPTIMIZE FOR,它可以帮助您为查询优化器定义(并解释)它应该优化的内容。

查看MSDN documentation on query hints了解完整详情。

这是您在添加索引时必须进行的典型和基本的权衡 - 是的,它可能会提高您查看的某个查询的性能 - 但同时可能会减少其他查询。这里真的没有简单的解决方案 - 要么其他查询的收益大于此查询的痛苦 - 然后保持索引。否则,放下它。

2

使用hints指导优化器使用特定的指标,甚至(从链接)

如果要强制表扫描,使用提示:(INDEX(0))。

+1

我无法想象强迫桌面扫描是一个好主意的许多情况。 – 2010-02-26 06:42:51

+0

当你知道你需要阅读整个表格时如何?你会通过查看索引中的每个条目来阅读整本书籍,然后阅读索引所引用的页面吗? – 2010-03-01 20:33:04

+1

表空间扫描是好的!如果您要读取超过40%的行,那么嗅探整个表并筛选出不需要的行比在索引周围反弹更有效。 – 2010-03-02 07:16:35

1

不知道这是否仍然有效,但在过去,围绕列名称换行使用通常会阻止索引的使用,例如

where substring(mycol,1,16) = ? 
+1

是真的,但那是治疗症状而不是原因... – 2010-02-26 06:43:25

1

查询提示应避免除非绝对必要(和大部分的时间不需要提示)。使用一个会回来咬你...

我建议你重建你的指数或更新你的统计数据。

2

我认为这里唯一的选择实际上是强制SQL Server使用一些特定的执行计划。为了做到这一点,您需要首先“制定”这个计划。尝试玩空数据库/重新计算统计/查询和表提示,以获得你想要的计划。之后,您应该保存该计划并将其应用于您的查询。您可以阅读关于如何执行此操作的详细说明herehere

0

我知道这是一个古老的问题,但对于任何绊倒这个(像我一样)的人来说,有一种方法可以防止索引被使用,尽管它有点迂回。

您需要告诉SQL不使用任何索引,然后准确告诉它可以使用哪些索引。

基本上,你最终会得到一个白色的索引列表。

FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) 

此处了解详情:http://msdn.microsoft.com/en-us/library/ms187373.aspx

相关问题