主键上的默认索引

Sha*_*yan 15 sql-server indexing primary-key

SQL Server默认情况下是否在主键上构建索引?如果是什么样的指数?如果没有哪种索引适合主键选择?

我使用SQL Server 2008 R2

谢谢.

Mar*_*ith 16

您可以自己轻松确定第一部分

create table x
(
id int primary key
)

select * from sys.indexes where object_id = object_id('x')
Run Code Online (Sandbox Code Playgroud)

object_id   name             index_id    type type_desc                                                    is_unique data_space_id ignore_dup_key is_primary_key is_unique_constraint fill_factor is_padded is_disabled is_hypothetical allow_row_locks allow_page_locks
1653580929  PK__x__6383C8BA    1           1    CLUSTERED                                                    1         1             0              1              0                    0           0         0           0               1               1
Run Code Online (Sandbox Code Playgroud)

编辑:还有一个我应该提到的案例

create table t2 (id int not null, cx int)

create clustered index ixc on dbo.t2 (cx asc)

alter table dbo.t2 add constraint pk_t2 primary key (id) 

select * from sys.indexes where object_id = object_id('t2')
Run Code Online (Sandbox Code Playgroud)

object_id   name                           index_id    type type_desc                      is_unique data_space_id ignore_dup_key is_primary_key is_unique_constraint fill_factor is_padded is_disabled is_hypothetical allow_row_locks allow_page_locks has_filter filter_definition
----------- ------------------------------ ----------- ---- ------------------------------ --------- ------------- -------------- -------------- -------------------- ----------- --------- ----------- --------------- --------------- ---------------- ---------- ------------------------------
34099162    ixc                            1           1    CLUSTERED                      0         1             0              0              0                    0           0         0           0               1               1                0          NULL
34099162    pk_t2                          2           2    NONCLUSTERED                   1         1             0              1              0                    0           0         0           0               1               1                0          NULL
Run Code Online (Sandbox Code Playgroud)

关于第二部分,没有黄金法则取决于您的个人查询工作量以及您的PK是什么.

为了满足主键的单个查找,非聚簇索引就可以了.如果您正在对范围进行查询,那么匹配的聚簇索引可以很好地满足这些要求,但覆盖非聚簇索引也可以满足要求.

您还需要特别考虑聚簇索引的索引宽度,因为它会影响所有非聚簇索引以及插入对页面拆分的影响.

我建议使用SQL Server 2008查询性能调优Distilled这本书来阅读有关这些问题的更多信息.


Dav*_*kle 11

是.默认情况下,会在所有主键上创建唯一的聚簇索引,但您可以创建唯一的非聚簇索引而不是您喜欢的索引.

至于适当的选择,我会说,对于你创建的80-90%的表,你通常希望聚簇索引是主键,但情况并非总是如此.

如果您对"其他内容"进行大范围扫描,通常会将聚簇索引设置为其他内容.例如,如果您具有合成主键*,但具有通常按范围查询的日期列,则通常希望该日期列成为聚簇索引中最重要的列.

*通常使用INT IDENTITY列作为表上的PK来完成.