似乎在2019版本之前的SQL Server中,集群keykeys上升到树形结构,非集群索引不唯一。有了更大的和多个集群key,你会获得更宽更高的树,花费你更多的存储大小和内存大小。
正因为如此,我们曾经将 PK
从聚类钥匙我的问题是
SQL Server 2019和Azure在非集群索引方面到底有没有变化
这种行为比这个网站上的很多人都要老。
正因为如此,我们曾经将PK与群组分开。
这几乎是一个不需要的微优化。
堆根本就没有聚类键,堆中的索引是什么方式呢
非集群非唯一索引总是以行定位符作为索引键。 对于堆来说,行定位符是ROWID(FileNo,PageNo,SlotNo)。
如果你想把行从你的宽PK的叶级移出来,一般是针对一个非常大的表。 而因此将行移到一个集群的columstore索引中也是一个不错的选择。 要做到这一点,只需放弃集群PK(这将使叶级作为一个堆),创建CCI,然后重新创建PK作为一个非集群PK。 eg
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一般不需要很多索引,因为它的扫描效率很高。