columnstore index如何知道一列中的哪些数据连接到其他列的数据?

时间:2018-03-16 16:25:38

标签: sql-server indexing columnstore

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

例如,如果我们使用传统的rowstore有以下表格表示:

> df$Pre.Accuracy[sign(df$Pre.Accuracy) == 1] <- paste0("+", df$Pre.Accuracy[sign(df$Pre.Accuracy) == 1])
> head(df)
    ID Exam   Predicted   Actual Actual.Bins Pre.Accuracy
1 S001    1      71-80% 66.66667      61-70%           -1
2 S002    1 50% or less 60.00000      51-60%           +1
3 S003    1      71-80% 60.00000      51-60%           -2
4 S004    1      71-80% 93.33333     91-100%           +2
5 S005    1      81-90% 86.66667      81-90%            0
6 S006    1      71-80% 66.66667      61-70%           -1

对于columnstore index:

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

我们如何知道使用列存储索引哪些数据连接到谁?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你并没有完全摆脱列与行之间的关系。简化的差异是表的存储方式。传统存储以行方式存储,而列存储以列方式存储。这里提供的文档链接有更多信息,我宁愿不复制和粘贴。

来自docs

  

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

     

columnstore列存储是逻辑上组织为a的数据   包含行和列的表,并以列方式物理存储   数据格式。

     

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

所以这是一个如何在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)