我是使用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
我们如何知道使用列存储索引哪些数据连接到谁?
答案 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)