我有Log和LogItem表;我正在编写查询以从这两者中获取一些数据。有成千上万个Logs
,每个Log
最多可以有125个LogItems
有问题的查询很复杂,因此我跳过了它(如果有人认为它很重要,可以将其发布),但是当我运行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或更少。