SQL Server没有使用分段索引是真的吗?
这怎么可能?如果是的话,优化器是如何决定何时使用索引的?
我已经搜索过了,但是找不到使Server忽略特定索引的公式/规则。
编辑:
实际上,我在这个文章中找到了以下语句
高分割度--如果索引碎片超过40%,优化器可能会忽略索引,因为搜索分段索引比执行表扫描代价更高。
因此,优化器似乎忽略了支离破碎的索引。有人能给我们带来更多的启示吗?
发布于 2014-02-05 11:24:46
SQL server在索引选择过程中不考虑碎片问题,以下简单的talk文章很好地解释了SQL server的索引选择机制的工作原理:
发布于 2014-02-05 09:17:13
我从未听说过严重支离破碎的索引。我不认为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)但是这也取决于在这个表中执行了多少次插入。
https://stackoverflow.com/questions/21571876
复制相似问题