Sql server 在SQL Server中,聚集键上升到具有非聚集索引的树

Sql server 在SQL Server中,聚集键上升到具有非聚集索引的树,sql-server,azure,heap,non-clustered-index,sql-server-2019,Sql Server,Azure,Heap,Non Clustered Index,Sql Server 2019,似乎在2019版之前的SQL Server中,集群键升级到树结构,没有唯一的非集群索引。使用更大和多个集群键,您可以获得更宽和更高的树,从而消耗更多的存储大小和内存大小 正因为如此,我们过去常常将PK与聚集键分开,我的问题是 SQL Server 2019和Azure在非群集索引中是否已更改 堆根本没有集群键,在堆中建立索引的方法是什么 是否在非群集索引中更改了SQL Server 2019和Azure 此行为比此网站上的许多人都要老 正因为如此,我们习惯于将PK与集群分离 这几乎总是不必要的微

似乎在2019版之前的SQL Server中,集群键升级到树结构,没有唯一的非集群索引。使用更大和多个集群键,您可以获得更宽和更高的树,从而消耗更多的存储大小和内存大小

正因为如此,我们过去常常将
PK
与聚集键分开,我的问题是

  • SQL Server 2019和Azure在非群集索引中是否已更改
  • 堆根本没有集群键,在堆中建立索引的方法是什么
  • 是否在非群集索引中更改了SQL Server 2019和Azure

    此行为比此网站上的许多人都要老

    正因为如此,我们习惯于将PK与集群分离


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

    堆根本没有集群键,在堆中建立索引的方法是什么

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

    如果您想将行从宽PK的叶级移出,通常是针对非常大的表。因此,将行移动到聚集的columstore索引可能是一个不错的选择。要做到这一点,只需删除集群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通常不需要很多索引,因为它的扫描效率很高。

    你的问题不清楚“上树结构”是什么意思。聚集索引键作为行定位器存储在非聚集索引的叶节点中,而不是存储在非叶节点中。对于堆,行定位器是RID(文件/页面/插槽)。我不相信SQL 2019中的体系结构已经改变。谢谢,但是当我们使用非唯一的非聚集索引时,聚集索引键会上升到根目录,您可以在数据库中看到它,只需使用
    EXEC('DBCC IND([OutputTableName],“[yourtable]”,您感兴趣的索引)从中选择[IndexLevel],[PagePID][IndexPagesOutput]按[IndexLevel]DESC排序,找到您的根页面,然后
    DBCC TRACEON(3604);DBCC页面(OutputTableName,1,根页面编号,您感兴趣的索引)
    这是您的根页面,在此页面中,您可以看到您的非唯一非聚集索引和您使用的聚集索引键。这几乎总是不必要的微优化,为什么?例如,当我们对pk使用多个guid fk时,这些多个guid将与每个非唯一非聚集索引一起上升到树中,如果我们有七个其中,树的大小变得比原始表大是的,但这有多重要?你能用现实的方式衡量它吗?创建了多少额外的索引?当我们有超过百万条记录时,它变得越来越大,它需要越来越多的存储空间和内存大小,然后性能变得如此糟糕,以至于没有人愿意使用i再也没有了,为什么?只是没有将PK与聚集键分开,但您仍然拥有带有宽键的索引。您只是将数据行移动到了另一个索引的叶级别。感谢您的时间,ef core不可能做到这一点?