假设我在SQL Server 2008中有以下表格:
ProfileID int //identity; index: unique, primary key, clustered
ClientID int
RegionID int
ProfileName nvarchar(50)
第2列和第3列通过外国关系链接到各自的表格。
假设我最常见的疑问是:
SELECT ProfileID, ProfileName
FROM Profiles
WHERE ClientID = ? AND RegionID = ?
ORDER BY ProfileName
哪种索引系统最适合?
如果我在(ProfileID,ProfileName)上放置覆盖索引,则会终止默认的聚簇索引,因为覆盖索引必须是非聚集的,但至少满足查询的返回部分。
如果我按原样保留主键,并独立索引ClientID和RegionID,这给了我3个必须由RDBMS维护的索引,PLUS仍然需要一个表扫描来返回ProfileName,因为它不是覆盖。这似乎很重。
简单的案例研究,指出复杂的索引计划可以如何。
答案 0 :(得分:1)
对于此查询:
SELECT ProfileID, ProfileName
FROM Profiles
WHERE ClientID = ? AND RegionID = ?
ORDER BY
ProfileName
你应该创建这个索引:
CREATE INDEX ix_profiles_region_client_name ON (RegionID, ClientID, ProfileName)
在(RegionID, ClientID)
的单个值中,记录按ProfileName
排序,因此记录将进行排序,不需要进行其他排序。
由于ProfileID
是PRIMARY KEY CLUSTERED
,因此它隐式包含在每个索引记录中,因此无需在索引定义中明确指定它。
如果它不是群集密钥,则需要将其添加到索引中以覆盖此查询:
CREATE INDEX ix_profiles_region_client_name__id ON (RegionID, ClientID, ProfileName) INCLUDE (ProfileID)