给定数据库表:
UserID (PK)
SomeTypeID (PK)
SomeSubTypeID (PK)
Data
如果您希望进行查询:
SELECT Data FROM Table WHERE UserID = {0} AND SomeTypeID = {1} AND SomeSubTypeID = {2}
你需要创建索引
UserID,SomeTypeID,SomeSubTypeID
吗?还是因为它们形成了主键,所以不需要创建索引?给定数据库表:
UserID (PK)
SomeTypeID (PK)
SomeSubTypeID (PK)
Data
如果您希望进行查询:
SELECT Data FROM Table WHERE UserID = {0} AND SomeTypeID = {1} AND SomeSubTypeID = {2}
UserID,SomeTypeID,SomeSubTypeID
吗?还是因为它们形成了主键,所以不需要创建索引?CREATE TABLE TBL (UserID, SomeTypeID, SomeSubType, Data
CONSTRAINT PK PRIMARY KEY (UserID, SomeTypeID, SomeSubType))
然后创建的默认索引是CLUSTERED
索引。
通常情况下(不是所有情况),在查找数据时,您希望查询使用NON-CLUSTERED
索引来过滤行,其中您用于过滤行的列将形成索引的键,从这些行返回的信息(列)作为INCLUDED
列,在本例中为DATA
,如下所示:
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));
但是,因为您希望将其定义为PRIMARY KEY
,所以您无法使用INCLUDE
功能,因此无法避免磁盘查找以获取DATA
列中的信息,这基本上就是具有默认CLUSTERED
索引的情况。
但是,仍然有一种方法可以确保主键提供的唯一性并从INCLUDE
功能中受益,以便尽可能减少磁盘I / O次数。
您可以将NONCLUSTERED INDEX
指定为UNIQUE
,这将确保组成索引键的所有3个列都是唯一的。
CREATE UNIQUE NONCLUSTERED INDEX ncl_indx
ON TBL (UserID, SomeTypeID, SomeSubType) INCLUDE (Data);