SQL Server是否使用了碎片索引?
如何实现这一点,如果可行,优化器如何决定何时使用索引?
我已经搜索过但无法找到使SQL Server忽略特定索引的公式/规则。
编辑:
实际上,我在article中找到了以下声明:
高碎片 - 如果索引碎片超过40%,则优化器 可能会忽略索引,因为搜索索引的成本更高 碎片索引而不是执行表扫描。
因此,似乎优化器毕竟忽略了碎片索引。 任何人都可以带来更多的光线吗?
答案 0 :(得分:1)
SQL服务器在索引选择过程中不考虑碎片,下面简单的谈话文章很好地解释了SQL服务器索引选择机制的工作原理:
答案 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)但这也取决于此表中完成了多少次插入。