Nat*_*ate 5 sql t-sql database sql-server indexing
我有Log和LogItem表; 我正在编写一个查询来从两者中获取一些数据.有成千上万,Logs每个Log可以有多达125LogItems
有问题的查询是复杂的,所以我正在跳过它(如果有人认为重要的是我可以发布它),但是当我运行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])
Run Code Online (Sandbox Code Playgroud)
只是为了好玩,我创建了这个新索引并运行了查询,令我惊讶的是,现在我的查询需要大约1秒才能运行,而不是10秒以上.
我假设我的现有索引将涵盖这个新查询,所以我的问题是为什么在我的新查询中使用的唯一列上创建新索引可以提高性能?我是否应该为我的where子句中使用的每个唯一列组合都有一个索引?
注意:我不认为这是因为SQL Server正在缓存我的结果,我在创建索引之前运行了大约25-30次查询并且它一直需要10-15秒,在索引之后它现在是一致的~1或更少.
索引中的列顺序很重要.如果过滤需要索引中的第1列和第4列,则索引不会有帮助.它仅在按前N个连续列过滤时才有用.
这是因为索引是一棵树.你不能有效地选择树在那里的所有节点column3 = something,因为它们散布所有其他的地方,属于不同的价值观column1和column2.但是如果你知道column1,column2那么在树中找到正确的分支是没有道理的.