如果它们是碎片化的话,不使用索引是神话吗?

时间:2014-02-05 08:16:02

标签: tsql indexing sql-server-2012 fragmentation

SQL Server是否使用了碎片索引?

如何实现这一点,如果可行,优化器如何决定何时使用索引?

我已经搜索过但无法找到使SQL Server忽略特定索引的公式/规则。

编辑:

实际上,我在article中找到了以下声明:

  

高碎片 - 如果索引碎片超过40%,则优化器   可能会忽略索引,因为搜索索引的成本更高   碎片索引而不是执行表扫描。

因此,似乎优化器毕竟忽略了碎片索引。 任何人都可以带来更多的光线吗?

2 个答案:

答案 0 :(得分:1)

SQL服务器在索引选择过程中不考虑碎片,下面简单的谈话文章很好地解释了SQL服务器索引选择机制的工作原理:

Index Selection and the Query Optimizer

答案 1 :(得分:0)

我从来没有听说过碎片严重的索引。我不认为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%的值,则使用表扫描。是使用索引还是表扫描,使用统计信息确定。高碎片会影响(部分)索引扫描的速度,从而导致优化器比使用未碎片化的索引更快地选择表扫描。因此,尽管它是一个影响索引质量的参数,但我认为索引并不只是因为它的碎片很严重。

尽管如此,不要让你的索引碎片化:)。 Microsoft建议重新组织任何带有碎片的索引> 5%并重建一个碎片> 30%。 (http://support.microsoft.com/kb/2755960)但这也取决于此表中完成了多少次插入。