我有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,那么在树中找到正确的分支是没有道理的.