索引是否被使用,如果它们被分割,这是一个神话吗?

问题描述:

确实SQL Server没有使用碎片化的索引?索引是否被使用,如果它们被分割,这是一个神话吗?

这是如何可能的,如果是这样,优化程序如何决定何时使用索引?

我搜索了四周,但无法找到使SQL Server忽略特定索引的公式/规则。

编辑:

其实,我发现下面的语句在此article

高不成 - 如果索引是零散的40%以上,优化 可能会忽略指数,因为它是搜索 碎片索引比执行表扫描更昂贵。

因此,似乎优化器忽略了碎片化索引。 任何人都可以带来更多的灯光如何做到这一点?

+0

我真的不相信那篇文章中,我运行了一些SQL服务器,我们没有运行任何索引维护,因为它造成的破坏比其他任何事情都要多,而且它在共享的SAN上,因此无论如何碎片整理毫无意义。这些索引几乎处于80/90%的分散状态,仍然由优化器使用。 – steoleary

我从来没有听说过严重支离破碎的索引。我不认为SQL服务器优化器查看碎片不使用索引。

要确定是否使用索引,SQL Server使用统计信息。如果您认为可以使用索引但不被服务器使用,则您的统计信息可能是错误的。

如果您想了解更多关于统计: http://blog.idera.com/sql-server/understanding-sql-server-statistics/有关索引碎片,什么 更多信息,可以为此做些: http://www.brentozar.com/archive/2012/08/sql-server-index-fragmentation/

编辑: 我读过的文章,它说,“可能忽略”。根据我的统计数据,再次忽视这一点。

示例:如果统计信息表明只有一行(成千上万)具有搜索值,那么我认为它将使用索引,无论这是多么零散。它只需要读取3页而不是整个表格。如果统计数据显示正在搜索50%的值,则使用表扫描。是否使用索引或表扫描是通过统计来确定的。高碎片会影响(部分)索引扫描的速度,从而导致优化器比没有碎片的索引更快地选择表扫描。因此,尽管这是一个影响索引质量的参数,但我不认为索引并不仅仅是因为它的分散性很差。

尽管如此,不要让你的索引变得零散:)。微软建议重新组织碎片> 5%的任何索引,并重建碎片> 30%的碎片。 (http://support.microsoft.com/kb/2755960)但是,这也取决于该表中有多少个插入。在指标选择过程

SQL服务器不考虑碎片,下面简单谈文章做了解释的SQL服务器的索引选择机制运作的一个好工作:

Index Selection and the Query Optimizer

+0

那么,我已经阅读了你的参考资料,其他人试图找到某个地方说分散索引被使用或没有使用但失败。所以,我猜如果没有人指出他们被忽略,你的回答是正确的:-) – gotqn