列存储索引如何知道一列中的哪些数据连接到其他列中的数据?

Posted

技术标签:

【中文标题】列存储索引如何知道一列中的哪些数据连接到其他列中的数据?【英文标题】:How columnstore index knows which data from one column are connected to data from other columns? 【发布时间】:2018-03-16 16:25:37 【问题描述】:

我是使用列存储索引的新手。列存储数据的新的不同结构提出了一个问题。 我们如何知道一列中有哪些数据1(第1页) 连接到其他 column2 (page2)。

例如,如果我们有以下使用传统行存储的表表示:

row1  1   2  3 -- page1
row2  4   5  6 -- page2

对于列存储索引:

col1  col2  col3
1      2     3
4      5     6

我们如何使用列存储索引知道哪些数据与谁相关?

【问题讨论】:

我将其标记为转移到 DBA 堆栈交换。也许那里的一些超级高调的 SQL Server 人员可以教我们一两件事。 【参考方案1】:

没有显式连接,就像基于行的表中的列值之间没有显式连接一样。即便如此,我们总是可以通过简单的枚举从一个到另一个。

想象以基于行的方式读取列组(col1 的第一个值,col2 的第一个值,col3 的第一个值),然后就是你的行了。当相同的列值被压缩到范围时,想象它们带有数字,告诉你它们出现了多少次——你仍然可以通过简单的计数来读取行,即使这个过程效率低下。请求任何特定行 (SELECT * FROM T WHERE Column = uniquevalue) 需要在列存储中搜索该值,这非常快,然后使用其位置在所有其他列组中查找所有其他值以取回一行,这通常是不是,因为在最坏的情况下,我们需要通读所有范围内的所有值。 (当然,传统的 B-tree 索引可以帮助解决这个问题,这就是您使用它们进行行查找的原因。)

【讨论】:

非常感谢您的回答!【参考方案2】:

您并没有完全摆脱列与其行之间的关系。简化的区别在于表的存储方式。传统存储以行方式物理存储,而列存储以列方式存储。此处提供的文档链接包含更多我不想复制和粘贴的信息。

来自docs:

关键术语和概念 这些是相关的关键术语和概念 使用列存储索引。

columnstore 列存储是按逻辑组织为 具有行和列的表,并按列物理存储 数据格式。

行存储 行存储是逻辑组织为表的数据 具有行和列,然后物理存储在逐行数据中 格式。这是存储关系表的传统方式 数据。在 SQL Server 中,行存储是指底层的表 数据存储格式是堆、聚集索引或 内存优化表。

下面是一个关于如何在 TSQL 中保留关系的示例。对具有 CS 索引的表运行此操作(免责声明:我不是 CS 索引方面的专家):

SELECT o.name AS table_,
i.name AS index_, 
i.type_desc AS index_type, 
p.partition_number, 
rg.row_group_id, 
cs.column_id, 
c.name AS column_


FROM sys.objects o

INNER JOIN sys.indexes i 
    ON i.object_id = o.object_id

INNER JOIN sys.partitions p
    ON p.object_id = o.object_id
    AND i.index_id = p.index_id

INNER JOIN sys.column_store_row_groups rg
    ON rg.object_id = o.object_id 
    AND i.index_id = rg.index_id

INNER JOIN sys.column_store_segments cs
    ON cs.partition_id = p.partition_id

INNER JOIN sys.columns c
    ON c.object_id = o.object_id
    AND c.column_id = cs.column_id


WHERE o.object_id = OBJECT_ID(your_table_name)

【讨论】:

文档实际上并没有解释列存储如何能够将自身重新组合回行。把它写出来是一个有用的思考练习。 @JeroenMostert 列存储索引基于来自行组的列段。如果每个列段是行组中的 1 列,我想像 MS 的人会保留元数据来说明哪个列段来自哪个行组以及哪个行组与哪个表对齐。 我不认为 OP 对这种关系意味着什么——至少,这不是 对那个问题的想象。但我会自己编造答案。 感谢您的回答! :)

以上是关于列存储索引如何知道一列中的哪些数据连接到其他列中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据框的其他列中的一列中搜索字符串

根据 Pandas 中另一列中的索引从列中获取数据

将列名连接到另一列中的值

如何将数据帧的2列组合到另一列中

如何在数据帧中沿值的一列生成随机均匀分布而不必对所述列中的每个值重复?

求代码,Linux系统如何输出文件中某一列数据第一个峰值对应的其他列中的数据