2009-05-06 53 views
1

我有一个需要很长时间执行的报告。我运行了数据库引擎优化顾问,其中一项建议是创建2个索引。但是,我注意到这些索引是相同的列,但顺序不同。SQL Server 2005按不同顺序将相同的列索引

下面是表:

---Locations--- 
| *LocationID | 
| Code  | 
| ...more... | 
| DivisionID | 
| RegionID | 
--------------- 

和建议是添加这些2个指标

CREATE NONCLUSTERED INDEX [IX_Locations_Region_Loc_Div] ON [dbo].[Locations] 
(
    [RegionID] ASC, 
    [LocationID] ASC, 
    [DivisionID] ASC 
) 
INCLUDE ([Code]) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY] 
GO 

CREATE NONCLUSTERED INDEX [IX_Locations_Loc_Reg_Div] ON [dbo].[Locations] 
(
    [LocationID] ASC, 
    [RegionID] ASC, 
    [DivisionID] ASC 
) 
INCLUDE ([Code]) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY] 
GO 

为什么会在SQL Server必须当他们是不同的顺序这3个的索引仅用于内部连接?

SELECT UserID, LocationID FROM [User] u INNER JOIN [Locations] l ON u.LocationID = l.LocationID 

回答

2

它不适合你包含的SQL。还有其他的问题正在考虑做出这个建议。

0

运行调整引擎时,在语句中是否存在where子句?我会同样在声明中加上一个order by子句,看看是否有助于数据库/调优引擎知道如何最好地对齐索引。

0

回答你的问题的一种方法是在添加索引之前查询Sql Server Management Studio中的执行计划,然后再查找索引。那里总是有趣的,如果没有用的信息

0

我不知道2005年左右,但我知道,(至少部分)SQL Server的早期版本只会拿起一个指标,如果在where子句中的列都在同一顺序列中使用该指数。不喜欢它,但确实证明了它。

我只注意到你在谈论加入 - 当时,我主要是写我的where子句中,而不是使用ANSI语法连接,所以我认为它仍然适用。

相关问题