【问题标题】:What is the difference between clustered and non-clustered columnstore index with respect to rowstore data page concept就行存储数据页概念而言,聚集列存储索引和非聚集列存储索引有什么区别
【发布时间】:2023-03-10 04:44:01
【问题描述】:
  1. 基于行的聚集索引中:整个表数据(所有列)按聚集索引列排序。每个页面包含特定数量的行和所有列。

  2. 基于行的非聚集索引 - 创建一个保存索引列的数据结构。索引列的每个 都保存该列的逐行值,并且每一行都指向(另一页)聚集索引表键行或堆行(如果不存在聚集索引)以供休息的数据。

我理解 列存储索引 的概念 - 在存在行组的意义上。每个行组包含表中每一列的一个列段(压缩),并且有一个增量存储来保存插入/更新,直到调用下一个元组移动器进程。基于以上 2 点行存储索引(page)请您告诉我在聚集和非聚集列存储索引的情况下它是如何工作的。

示例 - 在列存储非聚集索引存储的情况下,它在概念上是否与行存储非聚集索引相同 - 即 - 索引列的单独页面,其值指向堆或聚集索引键。

【问题讨论】:

  • 您查看过documentation吗?
  • 是的,但它没有提供有关页面概念的信息,请您指导我

标签: sql-server columnstore


【解决方案1】:

在比较行存储与列存储时,术语集群表示所有列,非集群表示某些列(除非一个包含所有列)。行存储/列存储组织的不同架构之间没有其他类似之处。我个人在提到列存储时根本不使用索引这个词,因为该结构针对扫描而不是查找进行了优化,并且经常导致混淆。

列存储索引段,无论是否聚集,本质上只是存储在页面/范围中的压缩数据块。行存储,OTOH,每行都有一个记录结构,以容纳不同类型和可空性的多个列,这就是为什么它们不像列存储数据那样压缩。

【讨论】:

  • 你好@Dan,你的意思是 - 在非聚集列存储索引的情况下,索引列存储在数据表页面的单独页面中?这是否意味着非聚集列存储索引的概念与行存储非聚集索引概念相同?以及索引页中的列值,它们指向什么?行组页面?
  • 对于行存储表上的非聚集列存储,行定位器是聚集索引键或堆的页/行/槽。这与行存储非聚集索引中使用的指针相同。
  • 只有当查询对该索引列进行聚合时,才能说使用列存储索引可以提高性能是正确的吗?我的理由是因为索引列(列存储)值将更接近(在相同或多个页面上),因此获取数据会更快。而如果查询是从多个列中获取数据,那么它会相对较慢,因为它需要从列存储索引中获取聚集索引键,然后去行存储表中获取 addn reqd 信息。在这种情况下,引擎会决定忽略列存储索引吗?
  • @variable,性能可能很大程度上取决于必须从行存储中获取多少行才能获得结果,并且优化器应该理想地选择是否使用列存储索引。即使没有聚合,扫描和过滤列存储索引列,然后检索行存储列以获得最终结果也可能很有效。
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多