微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server – 当现有索引包含新索引中的所有列时,为什么创建这个新索引会提高性能呢?

我有Log和LogItem表;我正在编写一个查询来从两者中获取一些数据.有数千个日志,每个日志最多可以有125个LogItem

有问题的查询是复杂的,所以我正在跳过它(如果有人认为重要我可以发布它),但是当我运行SSMS估计查询计划时,它告诉我一个新的非聚集索引会将性能提高到100% .

Existing Index: Non-clustered
Key Colums (LogItem): ParentLogID,DateModified,Name,DatabaseModified

Query Plan Recommendation
CREATE NONCLUSTERED INDEX [LogReportIndex]
ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified])

只是为了好玩,我创建了这个新索引并运行了查询,令我惊讶的是,现在我的查询运行需要大约1秒,而在10秒之前.

我假设我的现有索引将涵盖这个新查询,所以我的问题是为什么在我的新查询中使用的唯一列上创建新索引可以提高性能?我应该在where子句中使用每个唯一列组合的索引吗?

注意:我不认为这是因为sql Server正在缓存我的结果,我在创建索引之前运行了大约25-30次查询并且它一直需要10-15秒,在索引之后它现在是一致的~1或更少.

解决方法

索引中的列顺序很重要.如果过滤需要索引的第1列和第4列,则索引不会有帮助.它仅在按前N个连续列过滤时才有用.

这是因为索引是一棵树.您无法有效地选择column3 = something的树的所有节点,因为它们分散在所有其他位置,属于column1和column2的不同值.但是如果你也知道column1和column2,那么在树中找到正确的分支是没有道理的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐