1

我认为列存储的工作方式是,如果您将超过 102,400 行批量加载到列存储的一个分布中,它会自动压缩它。我没有在 Azure SQL DW 中观察到这一点。

我正在执行以下 CTAS 声明:

create table ColumnstoreDemoCTAS
WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION=HASH(Column1))
AS
select top 102401 cast(1 as int) as Column1, f.*
from FactInternetSales f
cross join sys.objects o1
cross join sys.objects o2

现在我检查列存储行组的状态:

select t.name
,NI.distribution_id
,CSRowGroups.state_description
,CSRowGroups.total_rows
,CSRowGroups.deleted_rows
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.pdw_index_mappings AS IndexMap
    ON i.object_id = IndexMap.object_id
    AND i.index_id = IndexMap.index_id
JOIN sys.pdw_nodes_indexes AS NI
    ON IndexMap.physical_name = NI.name
    AND IndexMap.index_id = NI.index_id
LEFT JOIN sys.pdw_nodes_column_store_row_groups AS CSRowGroups
    ON CSRowGroups.object_id = NI.object_id 
    AND CSRowGroups.pdw_node_id = NI.pdw_node_id
    AND CSRowGroups.distribution_id = NI.distribution_id
    AND CSRowGroups.index_id = NI.index_id    
WHERE t.name = 'ColumnstoreDemoCTAS'
ORDER BY 1,2,3,4 desc;

我最终得到一个具有 102401 行的 OPEN 行组。我是否误解了列存储的这种行为?Azure SQL DW 有什么不同吗?

如果我从 SSIS 执行相同数量的行的批量插入,我会看到相同的行为,所有这些都作为一个缓冲区。

我尝试了 Drew 的插入超过 650 万行的建议,但我仍然得到了所有 OPEN 行存储:

create table ColumnstoreDemoWide
WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION=HASH(Column1))
AS
select top 7000000 ROW_NUMBER() OVER (ORDER BY f.ProductKey) as Column1, f.*
from FactInternetSales f
cross join sys.objects o
cross join sys.objects o2
cross join sys.objects o3
4

2 回答 2

2

将数据放在聚集列存储中不会减少返回的行数。相反,它将压缩存储的数据,以便占用更少的磁盘空间。这将意味着为查询移动的数据更少,您的存储费用也将减少,但您的结果将保持不变。话虽如此,您的数据当前位于增量存储中,因此您不会看到任何压缩。由于 SQL DW 的架构,我们在后台将数据分成多个组。这使我们能够更轻松地并行计算和扩展,但也意味着每个组都将拥有自己的列存储/增量存储,因此您需要加载更多行来获得压缩优势。

除了分布结构之外,与 SQL 数据仓库相比,SQL Server 的阈值也存在差异。对于 DW,阈值是 1,048,576,直到 @JRJ 描述的缺陷得到解决。现在 Azure SQL DW 的阈值是 120,400,与 SQL 系列的其余部分一样。一旦分布中的行超过此值,您应该会看到您的行已被压缩。

您可以在此处找到有关加载到列存储的更多信息:https ://msdn.microsoft.com/en-US/library/dn935008.aspx

于 2016-01-07T19:00:21.810 回答
1

这是服务中的一个缺陷。该修复程序目前正在推出。例如,如果您在 Japan West 上尝试此操作,您会发现行为与您预期的一样。

于 2016-03-07T22:58:08.170 回答