【发布时间】:2017-11-29 09:07:23
【问题描述】:
我用来在表上创建索引的 API 将所有非聚集索引创建为包含主键的唯一索引。
所以给出下表:
CREATE TABLE Person
(
[PersonID] INT NOT NULL PRIMARY KEY, -- clustered key on this col.
[First Name] VARCHAR(50),
[Last Name] VARCHAR(50),
[Other Columns] VARCHAR(50)
)
API 创建的非聚集索引的 SQL 语句如下所示:
CREATE UNIQUE NONCLUSTERED INDEX KeyName
ON Person ([First Name], [Last Name], [PersonID])
通过在索引中包含主键,可以确保所有条目都是唯一的。
我个人会这样创建索引:
CREATE NONCLUSTERED INDEX KeyName2
ON Person ([First Name], [Last Name])
我在包含大约 2100 万条记录的表上使用了以下语句两次。我一次只激活了一个索引。
SELECT *
FROM Person
WHERE [First Name] = 'John'
AND [Last Name] = 'Doe'
无论启用/禁用哪个索引,“估计 CPU 成本”、“估计 I/O 成本”、“估计算子成本”和“估计子树成本”都完全相同。
我对非聚集索引的理解是,主键不用于检索数据,而是 SQL-Server 独立分配的一些行号。那么使用 UNIQUE 索引而不是 NON-UNIQUE 索引有什么好处吗?
我猜想 UNIQUE 索引会占用更多磁盘空间,因为它包含多列。因此,我更喜欢后一个版本。
使用 SQL-Server 2012
【问题讨论】:
-
Clustered and Nonclustered indexes: "从非聚簇索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于...对于聚簇表,行定位器是聚集索引键。”。因此,如果您的 PK 是集群的,那么您对“无论如何都不使用主键来检索数据”的假设是不正确的。
标签: sql sql-server indexing