首先,使用代理标识列 (SaleItemID) 作为聚集索引是否更好?或者查找我期望在从表中读取数据时经常使用的列,但它不是唯一的 (SalesCategoryID)。
我随着表的增长调整索引,但我正在为我的聚集索引寻找一个好的起点。
-- OPTION #1: clustered index on primary key (so, unique)
CREATE TABLE dbo.SaleItems
(
SaleItemID INT IDENTITY PRIMARY KEY CLUSTERED,
SalesCategoryID int NOT NULL,
SaleItemName varchar (100) NOT NULL,
SalesPrice smallmoney NULL
);
-- OPTION #2: clustered index on column that matches common filter (not unique)
CREATE TABLE dbo.SaleItems
(
SaleItemID INT IDENTITY PRIMARY KEY,
SalesCategoryID int NOT NULL,
SaleItemName varchar (100) NOT NULL,
SalesPrice smallmoney NULL
);
CREATE CLUSTERED INDEX IX_SaleItems_SalesCategoryID ON dbo.SaleItems (SalesCategoryID);
检查色谱柱的选择性
SalesCategoryID
理想的
Selectivity =1
即是唯一的密钥。所以选择性应该非常接近 1。如果有上百万条记录,SalesCategoryID就会分散在很多数据页中。因此插入/更新性能将会受到影响。
另外,在 Cost Base Plan 的情况下,不能保证 SQL 优化器会选择 CLustered Index Seek。
SaleItemID 作为聚集索引。
SalesCategoryID 作为非聚集索引。
在这种情况下,插入/更新不会受到影响,因为 Sql optmizer 将在最后一页追加数据。
NonClustered 索引,SalesCategoryID 将处于叶级,并且 NonClustered 索引数据页的数量会更少。由于数据页将仅包含 的值
INT SalesCategoryID
。因此 optmizer 可能会选择此计划。它将从非聚集索引页面读取 SalesCategoryID,并直接在 SaleItemID 聚集索引数据页面中查找其他详细信息。一步可能多,但读取的数据页数会少,所以成本会少