在哪些列上创建索引?

K09*_*K09 1 index sql-server primary-key

我有一个表,最多包含 20 列。数据按 3 列选择、插入和删除:用户名、开始日期和结束日期。

这 3 列不是唯一的。

该表是一个独立的表 - 没有连接到其他表。

我是否在这 3 列上创建聚集索引?或者我是否创建一个作为 PK 自动递增的 UniqueID,然后在这 3 列上创建一个非聚集索引?或者根本不需要主键?

SELECT StartDate, EndDate, Username, Value1, Value2, Value3, Value4, Value5, Value6
FROM  myTbl
WHERE Username = @Username
AND StartDate = @StartDate
AND EndDate = @EndDate;


DELETE FROM  myTbl
WHERE Username = @Username
AND StartDate = @StartDate
AND EndDate = @EndDate
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 6

从给出的有限信息来看,一个合适的非唯一聚集索引是:

CREATE CLUSTERED INDEX CX_dbo_myTbl_StartDate_EndDate_Username
ON dbo.myTbl (StartDate, EndDate, UserName);
Run Code Online (Sandbox Code Playgroud)

也就是说,还有各种各样的其他考虑因素可能意味着不同的选择对于整个工作负载来说是最佳的。如果你用更多的细节改进你的问题,就有可能给出更好的答案。

此外,一般来说,a PRIMARY KEY(是否成簇)是非常可取的。表的每一行(元组)都应该能够被唯一标识,这是关系设计的一个基本原则。