Sql server 是否需要在SQL server中的多字段主键上创建索引?

Sql server 是否需要在SQL server中的多字段主键上创建索引?,sql-server,indexing,primary-key,Sql Server,Indexing,Primary Key,给定数据库表: UserID (PK) SomeTypeID (PK) SomeSubTypeID (PK) Data 您希望查询: SELECT Data FROM Table WHERE UserID = {0} AND SomeTypeID = {1} AND SomeSubTypeID = {2} 您是否需要创建索引UserID、SomeTypeID、somesubscriptid,或者它们构成主键这一事实是否意味着不需要这样做?只要在筛选时使用主键中使用的所有列,您就不需要创建单独

给定数据库表:

UserID (PK)
SomeTypeID (PK)
SomeSubTypeID (PK)
Data
您希望查询:

SELECT Data FROM Table WHERE UserID = {0} AND SomeTypeID = {1} AND SomeSubTypeID = {2}

您是否需要创建索引
UserID、SomeTypeID、somesubscriptid
,或者它们构成主键这一事实是否意味着不需要这样做?

只要在筛选时使用主键中使用的所有列,您就不需要创建单独的索引。在您的示例中,主键是ok的


如果您计划对其中一列而不是其他列进行筛选,请考虑创建单独的索引。例如:如果您将主键创建为:

CREATE TABLE TBL (UserID, SomeTypeID, SomeSubType, Data 
    CONSTRAINT PK PRIMARY KEY (UserID, SomeTypeID, SomeSubType))
然后,正在创建的默认索引是
聚集的
索引

通常(因此并非所有时候),在查找数据时,您希望查询使用
非聚集的
索引来筛选行,其中用于筛选行的列将构成索引的键以及作为包含的
列从这些行返回的信息(列),在这种情况下,
数据
,如下所示:

CREATE NONCLUSTERED INDEX ncl_indx 
ON TBL (UserID, SomeTypeID, SomeSubType) INCLUDE (Data);
通过这样做,您可以避免通过
聚集索引访问表数据

但是,您可以指定希望您的
主键
成为的索引类型,因此:

CREATE TABLE TBL (UserID, SomeTypeID, SomeSubType, Data 
    CONSTRAINT PK PRIMARY KEY NONCLUSTERED (UserID, SomeTypeID, SomeSubType));
Buuut,因为您希望将其定义为
主键
,因此无法使用
包含
功能,因此无法避免磁盘查找以从
数据
列获取信息,这就是您基本上使用默认的
聚集
索引的地方

buuuuut,仍然有一种方法可以确保主键提供的唯一性,并从
INCLUDE
功能中获益,从而减少磁盘I/O

您可以将
非聚集索引
指定为
唯一
,这将确保构成索引键的所有3列都是唯一的

CREATE UNIQUE NONCLUSTERED INDEX ncl_indx 
ON TBL (UserID, SomeTypeID, SomeSubType) INCLUDE (Data);
通过执行所有这些操作,您的表将成为一个
堆。如果您在设计表时仔细考虑了它,并确定
聚集索引的最佳聚集键是(UserID、SomeTypeID、SomeSubType),那么最好将所有内容都保留为您当前拥有的内容


否则,如果您已经决定使用不同的聚集键,那么您可以添加这个唯一的非聚集索引,如果您要按照您所说的那样查询表。

主键已经创建了一个排序索引。除非您想查询彼此隔离的其他列,否则只使用主键就可以了。更多详细信息:(假设您使用Microsoft SQL)可能重复。。。