2012-12-04 93 views
1

我已经根据索引向导针对不同场景建议的方式创建了这两个索引。 我在想,如果他们是相同的还是他们不同?SQL Server中这两个索引之间的区别是什么?

指数(1):

CREATE NONClustered Index [IX_Rec_RecoveryDate_RecoveryDateTypeKey_CaseId] 
ON [Rec].[RecoveryDate] ([RecoveryDateTypeKey], [CurrentFlag]) 
INCLUDE (CaseId) 

指数(2):

CREATE NONClustered Index [IX_Rec_RecoveryDate_currentFlag] 
ON [Rec].[RecoveryDate] ([CurrentFlag]) 
INCLUDE (CaseId, RecoveryDateTypekey) 

回答

4

问题是,您试图优化哪些查询?

这两个指标有很大不同。第一个索引对于像这样的查询是很好的:

SELECT CaseId 
FROM Rec.RecoveryDate 
WHERE RecoveryTypeKey = 5 
AND CurrentFlag = 1 -- or whatever 

第一个索引WHERE子句中的列。 SQL Server将能够搜索指定的RecoveryDateTypeKey和CurrentFlag。由于CaseId在索引叶节点中包含INCLUDEd,因此SQL Server无需重新连接到表即可获取它。

使用相同的查询,第二个索引将表现不同。如果幸运的话,SQL Server将搜索CurrentFlag为1的所有记录。然后,它将遍历这些叶节点以查找匹配的RecoveryTypeKey。另一方面,如果CurrentFlag为1的记录数很多,则SQL Server可能会选择执行索引扫描。

话又说回来,如果你是想优化这样的查询:

SELECT CaseId, RecoveryTypeKey 
FROM Rec.RecoveryDate 
WHERE CurrentFlag = 1 

第一个指数是无用的,因为CurrentFlag是在索引的第二列。 SQL Server将无法搜索CurrentFlag = 1,因此它可能会执行索引扫描。

+0

感谢您的回答! – Jaxidian

2

它们是不同的。索引1索引两列,索引2索引一列,但在节点中包含两列。

的差别基本上意味着,如果你搜索使用的两列,索引1可能比指数快得多2.
指数2会比一列普通索引更好,因为如果你需要其它列在你的结果中,索引2已经有了值,所以不需要查找实际的表。

0

索引存储相同的信息(Recovery表中的每行有1行,列中有caseid,RecoveryDateTypeKey,CurrentFlag),但按不同的顺序组织,因此可用于不同的查询。

第一索引可以处理where子句如

WHERE RecoveryDateTypeKey = @p1 --Prefix matching! 

WHERE RecoveryDateTypeKey = @p1 AND CurrentFlag = @p2 

第二索引只处理

WHERE CurrentFlag = @p2 

如果CurrentFlag是低基数柱诸如位或char(1)(Y/N),那么我建议过滤索引。

CREATE INDEX IX_REC_Yes_fltr on Recovery (RecoveryDateTypeKey) WHERE (CurrentFlag = 'Y') 
INCLUDE (CaseId) --Assumes that CurrentFlag = 'Y' is the most used value 

--Maybe even a second one. 
CREATE INDEX IX_REC_No_fltr on Recovery (RecoveryDateTypeKey) WHERE (CurrentFlag = 'N') 
INCLUDE (CaseId) --Maybe handle CurrentFlag = 'N' as well. 

每个筛选索引仅包含满足标准值,这样组合时,它们的尺寸与未过滤的索引相同。

相关问题