Azure SQL DW CTAS, содержащий более 102 400 строк в одном распределении, автоматически не сжимается

Я думал, что способ работы хранилищ столбцов заключается в том, что если вы загрузите более 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

Теперь я проверяю статус групп строк columnstore:

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 строк. Неужели я неправильно понял такое поведение столбцов? Отличается ли Azure SQL DW от других?

Я вижу такое же поведение, если я выполняю массовую вставку из служб SSIS с таким же количеством строк, что и один буфер.

Я попробовал предложение Дрю о вставке более 6,5 миллионов строк, и я все еще получаю все открытые магазины строк:

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

2 ответа

Решение

Это был дефект в обслуживании. Исправление в настоящее время выкатывается. Например, если вы попробуете это на Japan West, вы увидите, что поведение такое, как вы ожидаете.

Размещение ваших данных в кластерном хранилище столбцов не уменьшит количество возвращаемых строк. Вместо этого он сжимает сохраненные данные, чтобы занимать меньше места на диске. Это будет означать, что для запросов будет перемещено меньше данных, и вы будете платить меньше за хранение, но ваши результаты останутся прежними. Тем не менее, ваши данные в настоящее время находятся в deltastore, поэтому вы не увидите никакого сжатия. Благодаря архитектуре SQL DW мы разделяем данные на несколько групп под обложками. Это позволяет нам упростить распараллеливание вычислений и масштабирования, но также означает, что у каждой группы будет свой собственный columnstore / deltastore, поэтому вам потребуется загрузить больше строк, чтобы получить преимущества от сжатия.

В дополнение к структуре распределения существует разница в пороговых значениях для SQL Server по сравнению с хранилищем данных SQL. Для DW порог составлял 1 048 576, пока дефект не был устранен, как описывает @JRJ. Теперь порог Azure SQL DW составляет 120 400, как и остальные члены семейства SQL. Как только ваши строки в распределении превысят это, вы увидите, что ваши строки сжаты.

Вы можете найти немного больше информации о загрузке в хранилище колонок здесь: https://msdn.microsoft.com/en-US/library/dn935008.aspx

Другие вопросы по тегам