非集群外键索引推荐

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_idcntnr_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)上进行。

Gre*_*che 5

聚簇索引作为二叉树物理存储在磁盘上。通常,它们非常适合读取繁重的工作负载。

探查器建议您不要在cntnr_content表上使用非聚集索引的原因是,您通常将使用外键访问该表上的数据。

在这种情况下,主键上的聚集索引无用,因为数据以某种使用外键时很难找到的方式分布在磁盘上。这就是为什么它建议使用非聚集索引的原因。

更改为非聚集索引后,数据库就可以选择一种磁盘格式,该磁盘格式对于通过外键进行查找更为理想。当然,这样做会影响主键上的查找速度,因此这是一个折衷方案-在一种情况下,您可以提高速度,而在另一种情况下,则需要牺牲一些速度。