何时使用覆盖索引,复合索引和唯一列式索引

时间:2010-11-11 15:44:22

标签: sql-server database-design indexing rdbms

假设我在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,因为它不是覆盖。这似乎很重。

简单的案例研究,指出复杂的索引计划可以如何。

1 个答案:

答案 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排序,因此记录将进行排序,不需要进行其他排序。

由于ProfileIDPRIMARY KEY CLUSTERED,因此它隐式包含在每个索引记录中,因此无需在索引定义中明确指定它。

如果它不是群集密钥,则需要将其添加到索引中以覆盖此查询:

CREATE INDEX ix_profiles_region_client_name__id ON (RegionID, ClientID, ProfileName) INCLUDE (ProfileID)