首页 > 解决方案 > 聚集键在 SQL Server 中使用非聚集索引上升到树

问题描述

似乎在 2019 版之前的 SQL Server 中,集群键/键上升到不具有唯一非聚集索引的树结构。使用更大和多个集群键/键,您可以获得更宽更高的树,这会花费您更多的存储大小和内存大小。

因此,我们曾经与PK聚集键分开我的问题是

  1. SQL Server 2019 和 Azure 在非聚集索引方面是否发生了变化?
  2. 堆根本没有聚类键/键,堆中的索引方式是什么?

标签: sql-serverazuresql-server-2019non-clustered-indexheap-table

解决方案


SQL Server 2019 和 Azure 是否更改了非聚集索引

这种行为比本网站上的许多人都早。

因此,我们曾经将 PK 与集群分开

这是几乎总是不必要的微优化。

堆根本没有聚类键/键,堆中的索引方式是什么

非聚集非唯一索引始终将行定位器作为索引键。对于堆,行定位符是 ROWID (FileNo,PageNo,SlotNo)。

如果要将行从宽 PK 的叶级别移出,通常适用于非常大的表。因此,将行移动到聚集的列存储索引可能是一个不错的选择。为此,只需删除集群 PK(这会将叶级别保留为堆),创建 CCI,然后将 PK 重新创建为非集群 PK。例如

drop table if exists t
go
create table t(id int not null, a int, b int)

alter table t 
  add constraint pk_t 
  primary key clustered(id)

go

alter table t drop constraint pk_t

create clustered columnstore index cci_t on t

alter table t 
  add constraint pk_t 
  primary key nonclustered (id)

如果您有其他非聚集索引,请先删除它们,如果您确实需要,仅在后面重新创建它们。IE 唯一索引、支持外键的索引或索引需要支持特定的查询。CCI 通常不需要大量索引,因为它的扫描效率很高。


推荐阅读