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来完成.
| 归档时间: |
|
| 查看次数: |
20007 次 |
| 最近记录: |