我们正在运行 SQL Server 2008。在查看我在 sys.dm_db_missing_index_* 视图上运行的查询的结果时,我看到了一个关于包含列的奇怪建议。我有以下两个表:
create table foo (
id int not null identity(1,1) primary key
/* many more fields, not relevant to question */
)
create table bar (
id int not null identity(1,1) primary key
foo_id int not null,
param_name nvarchar(50),
param_value nvarchar(255)
)
foo 表与 bar 是 1:M 的关系;bar 用于存储与 foo 中的某些记录相关的杂项。
回到 sys.dm_db_missing_index_* 查询。一天中有几次,优化器会在 equality_columns 中使用 foo_id 并在 included_columns 中使用 id 查找 bar 上的索引。我的问题是,将表的聚集索引键包含在非聚集索引中有什么意义?既然非聚集索引的叶级无论如何都包括聚集索引的键值,那么在非聚集索引中包括聚集索引键不是多余的吗?
编辑: bar 上唯一存在的索引是以 PK 为键的聚簇索引。
提前致谢。
是的,这是多余的。
另一方面,它不会造成任何伤害(因为优化器会忽略它并且不会添加两次数据)。
这是不按表面价值采用建议指数的众多原因之一。