【问题标题】:Is it a myth that Indexes are not used if they are fragmented?如果索引是碎片化的,那么不使用索引是否是一个神话?
【发布时间】:2014-03-01 13:36:15
【问题描述】:

SQL Server 确实没有使用碎片化的索引吗?

这怎么可能?如果是,优化器如何决定何时使用索引?

我已经四处搜索,但找不到使 SQL Server 忽略特定索引的公式/规则。

编辑:

其实我在这个article中找到了如下语句:

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

所以,优化器似乎最终忽略了碎片索引。 任何人都可以更清楚地说明这是如何完成的吗?

【问题讨论】:

  • 我真的不相信那篇文章,我运行了一些 SQL 服务器,我们不运行任何索引维护,因为它会造成比其他任何东西更多的中断,而且它无论如何都在共享 SAN 上,所以碎片整理是反正没意义。这些索引几乎处于 80/90% 的碎片化状态,仍然被优化器使用。

标签: tsql indexing sql-server-2012 fragmentation


【解决方案1】:

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

Index Selection and the Query Optimizer

【讨论】:

  • 好吧,我已经阅读了您的参考资料,其他人试图找到某处指出使用或未使用碎片索引但失败。所以,我想如果没有任何地方指出它们被忽略,那么你的答案是正确的:-)
【解决方案2】:

我从未听说过严重碎片化的索引。我不认为 SQL 服务器优化器会考虑不使用索引的碎片。

要确定是否使用了索引,SQL 服务器使用统计信息。如果您认为可以使用索引但服务器没有使用它,那么您的统计数据可能是错误的。

如果您想了解更多关于统计的信息: 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) 但这也取决于此表中完成了多少次插入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 2018-12-13
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多