Col*_*e W 0 sql-server indexing foreign-keys sql-server-2012
我的数据库中有几个表是父子关系。例如:
CREATE TABLE [dbo].[cntnr_header]
(
[cntnr_id] [dbo].[uid] NOT NULL,
CONSTRAINT [pk_cntnr_header] PRIMARY KEY CLUSTERED ([cntnr_id] ASC),
);
CREATE TABLE [dbo].[cntnr_content]
(
[cntnr_content_id] [dbo].[uid] NOT NULL,
[cntnr_id] [dbo].[uid] NOT NULL,
CONSTRAINT [pk_cntnr_content]
PRIMARY KEY CLUSTERED ([cntnr_content_id] ASC),
CONSTRAINT [fk_cntnr_content_cntnr_header]
FOREIGN KEY ([cntnr_id])
REFERENCES [dbo].[cntnr_header] ([cntnr_id]),
);
Run Code Online (Sandbox Code Playgroud)
如您所见,当前cntnr_id
在表中的外键上没有索引cntnr_content
。我运行了调优向导,实际上我看到它建议为表cntnr_content_id
和cntnr_id
表都添加一个非聚集索引cntnr_content
。我不太了解这一点,因为cntnr_content_id
它已经是聚集索引。为什么会推荐这样的索引?
CREATE NONCLUSTERED INDEX [_dta_index_cntnr_content_7_821577965__K1_K2] ON [dbo].[cntnr_content]
(
[cntnr_content_id] ASC,
[cntnr_id] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我认为我可能应该cntnr_id
在此表中添加一个非聚集索引。
有针对这种情况的建议做法吗?我是否应该始终添加具有此类关系的某些索引?
许多查询要么将这两个表连接在一起,cntnr_id
要么cntnr_content
通过指定进行选择cntnr_id
。这也是一个更新/删除重表。更新和删除始终在主键(cntnr_content_id
)上进行。
聚簇索引作为二叉树物理存储在磁盘上。通常,它们非常适合读取繁重的工作负载。
探查器建议您不要在cntnr_content表上使用非聚集索引的原因是,您通常将使用外键访问该表上的数据。
在这种情况下,主键上的聚集索引无用,因为数据以某种使用外键时很难找到的方式分布在磁盘上。这就是为什么它建议使用非聚集索引的原因。
更改为非聚集索引后,数据库就可以选择一种磁盘格式,该磁盘格式对于通过外键进行查找更为理想。当然,这样做会影响主键上的查找速度,因此这是一个折衷方案-在一种情况下,您可以提高速度,而在另一种情况下,则需要牺牲一些速度。
归档时间: |
|
查看次数: |
6092 次 |
最近记录: |