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