主键与聚簇指数的关系

时间:2013-02-24 12:49:07

标签: sql sql-server database database-design

TABLE是否可以使用没有Clustered Index的主键?

并且TABLE是否具有没有主键的聚簇索引?

有人可以简单地告诉我主键和聚簇索引的关系吗?

6 个答案:

答案 0 :(得分:74)

主键是逻辑概念 - 它是表中行的唯一标识符。因此,它有一堆属性 - 它可能不是null,而且必须是唯一的。当然,由于您可能会通过其唯一标识符搜索记录,因此在主键上建立索引会很好。

聚集索引是物理概念 - 它是影响记录在磁盘上存储顺序的索引。这使得它在访问数据时成为一个非常快的索引,但如果主键不是序列号,它可能会减慢写入速度。

是的,您可以拥有一个没有聚簇索引的主键 - 有时候,您可能想要(例如,当您的主键是连接表上的外键组合时,您不希望招致写入时磁盘洗牌开销)。

是的,您可以在不是主键的列上创建聚簇索引。

答案 1 :(得分:30)

表可以具有未集群的主键,并且集群表不需要主键。所以这两个问题的答案都是肯定的。

聚簇索引存储叶级别的所有列。这意味着聚簇索引包含表中的所有数据。没有聚簇索引的表称为堆。

主键是默认情况下群集的唯一索引。默认情况下,在创建主键时,如果表尚未集群,则主键将创建为集群唯一索引。除非您明确指定nonclustered选项。

一个示例,其中t1具有非聚集主键,而t2未聚集但具有主键:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

Example at SQL Fiddle.

答案 2 :(得分:16)

首先,看看Index-Organized Tables and Clustered Indexes。实际上,我建议从头开始阅读整个Use the Index Luke!网站,直到您到达群集主题,以真正了解正在发生的事情。

现在,问题......


  

TABLE是否可以使用没有Clustered Index的主键?

是,在声明主键创建基于堆的表时使用NONCLUSTERED关键字。例如:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

这很不幸,因为很多人似乎只接受默认值(即CLUSTERED),即使在很多情况下基于堆的表实际上会更好(如链接文章中所述)。


  

并且TABLE是否具有没有主键的聚簇索引?

与其他一些DBMS不同,MS SQL Server将允许您拥有与主键不同的集群索引,甚至根本没有主键。

以下示例创建一个与PK不同的聚类索引,它在其上面具有UNIQUE约束,这在大多数情况下是您可能想要的:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

如果您选择非唯一的群集索引(使用CREATE CLUSTERED INDEX ...),MS SQL Server将通过向其添加隐藏字段来自动使其唯一。

请注意,对于范围扫描,群集的好处最为明显。如果您使用的聚簇索引与客户端应用程序执行的范围扫描没有“对齐”(例如,当过度依赖上面提到的隐藏列或在surrogate key上进行聚类时),几乎无法实现聚类的目的。


  

有人可以简单地告诉我主键和聚簇索引的关系吗?

在MS SQL Server下,主键也默认为 。您可以更改该默认值,如上所述。

答案 3 :(得分:4)

取自MSDN Using Clustered Indexes

的答案

TABLE是否可以使用没有Clustered Index的主键? - 是。

TABLE是否可以在没有主键的情况下拥有聚簇索引? - 是。

主键约束,可确保值的唯一性,以便始终可以通过该键专门识别行。

索引会自动分配给主键(因为行通常会被主键“查找”)。

非聚集索引是行的一个(或多个)列的逻辑顺序。可以将其视为表的另一个“副本”,按索引所在的任何列排序。

聚簇索引是指实际表按特定列进行物理排序的时间。表格并不总是具有聚集索引(即,当它由某物进行物理排序时,该事物可能未定义)。一个表不能有多个聚簇索引,尽管它可以有一个复合聚簇索引(即表通过例如Surname,Firstname,DOB进行物理排序)。

PK通常(但不总是)是聚集索引。

答案 4 :(得分:0)

它可能与此问题的答案无关,但主键和聚集索引的一些重要方面是 - >

如果存在一个主键(默认为Clustered Index,但我们可以更改它)和Clustered Index,那么我们就不能再为该表创建一个聚簇索引。 但是,如果尚未设置主键,并且存在聚簇索引,则我们无法创建具有聚簇索引的主键。

答案 5 :(得分:0)

对于可能值得的东西,在MS SQL Server中,主键中的所有列都必须定义为NOT Null,而创建唯一的聚簇索引则不需要这样。但不确定其他数据库系统。