1

列ストアの仕組みは、列ストアの 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 行の 1 つの OPEN 行グループになります。列ストアのこの動作を誤解していませんか? Azure SQL DW は異なりますか?

SSIS から同じ数の行をすべて 1 つのバッファーとして一括挿入すると、同じ動作が見られます。

650 万行以上を挿入するという Drew の提案を試してみましたが、それでもすべての 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 Data Warehouse と比較した場合、SQL Server のしきい値に違いがあります。DW の場合、@JRJ が説明するように欠陥が解決されるまで、しきい値は 1,048,576 でした。現在、Azure SQL DW のしきい値は、他の SQL ファミリと同様に 120,400 です。ディストリビューション内の行がこれを超えると、行が圧縮されていることがわかります。

列ストアへの読み込みに関する詳細については、 https ://msdn.microsoft.com/en-US/library/dn935008.aspx を参照してください。

于 2016-01-07T19:00:21.810 に答える