Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Качество группы строк определяется числом строк в группе строк. Увеличение доступной памяти может максимально увеличить число строк, которые индекс столбцового хранилища сжимает внутри каждой группы строк. Используйте эти методы для повышения скорости сжатия и производительности запросов для индексов columnstore.
Почему размер группы строк имеет значение
Поскольку индекс columnstore сканирует таблицу через сканирование сегментов столбцов каждой отдельной группы строк, увеличение количества строк в каждой такой группе улучшает производительность запросов. Если группы строк имеют большое количество строк, сжатие данных улучшается, что означает, что объем данных для чтения с диска меньше.
Дополнительные сведения о группах строк см. в руководстве по индексам Columnstore.
Целевой размер для групп строк
Для повышения производительности запросов цель состоит в том, чтобы максимально увеличить количество строк для каждой группы строк в индексе columnstore. Группа строк может иметь не более 1 048 576 строк. Это нормально, чтобы не было максимальное количество строк для каждой группы строк. Индексы Columnstore обеспечивают хорошую производительность, если в группах строк имеется не менее 100 000 строк.
Группы строк могут быть обрезаны во время сжатия
При массовой загрузке или перестроении индекса columnstore иногда недостаточно памяти для сжатия всех строк, назначенных для каждой группы строк. При нехватке памяти индексы columnstore обрезают размеры групп строк, чтобы сжатие в columnstore может завершиться успешно.
Если недостаточно памяти для сжатия по крайней мере 10 000 строк в каждую группу строк, будет создана ошибка.
Дополнительные сведения о массовой загрузке смотрите в статье Массовая загрузка в кластеризованный columnstore индекс.
Как мониторить качество группы строк
Динамическое представление управления (DMV) (sys.dm_db_column_store_row_group_physical_stats содержит определение представления, соответствующее базе данных SQL), которое раскрывает полезные сведения, такие как количество строк в группах строк и причина их обрезки, если она имела место. Вы можете создать следующее представление как удобный метод запроса этого динамического административного представления для получения информации о сокращении группы строк.
CREATE VIEW dbo.vCS_rg_physical_stats
AS
WITH cte
AS
(
select tb.[name] AS [logical_table_name]
, rg.[row_group_id] AS [row_group_id]
, rg.[state] AS [state]
, rg.[state_desc] AS [state_desc]
, rg.[total_rows] AS [total_rows]
, rg.[trim_reason_desc] AS trim_reason_desc
, mp.[physical_name] AS physical_name
FROM sys.[schemas] sm
JOIN sys.[tables] tb ON sm.[schema_id] = tb.[schema_id]
JOIN sys.[pdw_table_mappings] mp ON tb.[object_id] = mp.[object_id]
JOIN sys.[pdw_nodes_tables] nt ON nt.[name] = mp.[physical_name]
JOIN sys.[dm_pdw_nodes_db_column_store_row_group_physical_stats] rg ON rg.[object_id] = nt.[object_id]
AND rg.[pdw_node_id] = nt.[pdw_node_id]
AND rg.[distribution_id] = nt.[distribution_id]
)
SELECT *
FROM cte;
Столбец trim_reason_desc
указывает, была ли обрезана группа строк (trim_reason_desc = NO_TRIM подразумевает отсутствие обрезки, а группа строк имеет оптимальное качество). Следующие причины обрезки указывают на преждевременное сокращение группы строк:
- BULKLOAD: эта причина усечения используется, когда входящий пакет строк для загрузки содержал менее 1 миллиона строк. Движок создаст сжатые группы строк, если вставляется более 100 000 строк (в отличие от разностного хранилища), но при этом причина обрезки устанавливается как BULKLOAD. В этом сценарии рекомендуется увеличить пакетную нагрузку, чтобы включить дополнительные строки. Кроме того, повторно оцените схему секционирования, чтобы убедиться, что она не слишком детализирована, так как группы строк не могут охватывать границы секций.
- MEMORY_LIMITATION. Чтобы создать группы строк с 1 миллионами строк, требуется определенный объем рабочей памяти подсистемы. Если доступная память сеанса загрузки меньше требуемой рабочей памяти, группы строк будут преждевременно обрезаны. В следующих разделах объясняется, как оценить необходимую память и выделить больше памяти.
- DICTIONARY_SIZE. Эта причина обрезки означает, что обрезка группы строк произошла из-за наличия по крайней мере одного строкового столбца с широкими и/или высокой кардинальностью строками. Размер словаря ограничен 16 МБ в памяти, и после достижения этого ограничения группа строк сжимается. При возникновении этой ситуации рассмотрите возможность изоляции проблемного столбца в отдельной таблице.
Как оценить требования к памяти
Максимальная требуемая память для сжатия одной группы строк составляет примерно следующее:
- 72 МБ +
- #строки × #столбцы × 8 байт +
- #rows * #short-string-columns * 32 байт +
- #long-длинные строковые столбцы * 16 МБ для словаря сжатия
Примечание.
Если короткие строковые столбцы используют типы строковых данных < = 32 байта, а длинные строковые столбцы используют типы строковых данных > размером 32 байта.
Длинные строки сжимаются с помощью метода сжатия, предназначенного для сжатия текста. Этот метод сжатия использует словарь для хранения текстовых шаблонов. Максимальный размер словаря составляет 16 МБ. Существует только один словарь для каждого длинного строкового столбца в группе строк.
Способы уменьшения требований к памяти
Используйте следующие методы, чтобы уменьшить требования к памяти для сжатия групп строк в индексы columnstore.
Использование меньше столбцов
По возможности создайте таблицу с меньшим количеством столбцов. Когда группа строк сжимается в колонохранилище, индекс колонохранилища сжимает каждый сегмент столбца отдельно. Поэтому требования к памяти для сжатия группы строк увеличиваются по мере увеличения числа столбцов.
Используйте меньше строковых столбцов
Для столбцов строковых типов данных требуется больше памяти, чем числовые и датовые типы данных. Чтобы уменьшить требования к памяти, рассмотрите возможность удаления строковых столбцов из таблиц фактов и их размещения в небольших таблицах измерений.
Дополнительные требования к памяти для сжатия строк:
- Строковые типы данных не более 32 символов могут требовать 32 дополнительных байта для каждого значения.
- Строковые типы данных с более чем 32 символами сжимаются с помощью методов словаря. Каждому столбцу в группе строк может потребоваться до 16 МБ для создания словаря.
Избегайте избыточного секционирования
Индексы Columnstore создают одну или несколько групп строк на секцию. Для хранения данных в Azure Synapse Analytics количество секций быстро растет, так как данные распределяются и каждый дистрибутив секционируется. Если в таблице слишком много секций, может быть недостаточно строк для заполнения групп строк. Отсутствие строк не создает давление памяти во время сжатия, но приводит к группам строк, которые не обеспечивают лучшую производительность запросов columnstore.
Другая причина, по которой следует избегать чрезмерного секционирования, заключается в том, что существует дополнительная нагрузка на память при загрузке строк в индекс columnstore на секционированной таблице. Во время загрузки многие секции могут получать входящие строки, которые хранятся в памяти, пока каждая секция не содержит достаточно строк для сжатия. Наличие слишком большого количества секций создает дополнительное давление на память.
Упрощение запроса загрузки
База данных распределяет выделение памяти для запроса среди всех операций. Когда запрос нагрузки имеет сложные сортировки и соединения, объем памяти, доступной для сжатия, уменьшается.
Создайте запрос нагрузки, чтобы сосредоточиться только на загрузке запроса. Если необходимо выполнить преобразования данных, выполните их отдельно от запроса загрузки. Например, разместите данные в таблице кучи, выполните преобразования, а затем загрузите промежуточную таблицу в индекс columnstore.
Настройка MAXDOP
Каждое распределение сжимает группы строк в хранилище столбцов параллельно, если для каждого распределения доступно более одного ядра ЦП. Параллелизм требует дополнительных ресурсов памяти, что может привести к нехватке памяти и обрезанию групп строк.
Чтобы уменьшить нагрузку на память, можно использовать указание запроса MAXDOP для принудительного выполнения операции загрузки в последовательном режиме в каждом распределении.
CREATE TABLE MyFactSalesQuota
WITH (DISTRIBUTION = ROUND_ROBIN)
AS SELECT * FROM FactSalesQuota
OPTION (MAXDOP 1);
Способы выделения большего объема памяти
Размер DWU и класс ресурсов пользователя вместе определяют, сколько памяти доступно для запроса пользователя. Чтобы увеличить выделение памяти для запроса на загрузку, можно увеличить количество DWUs или повысить класс ресурсов.
- Чтобы увеличить количество DWUs, см. раздел "Как масштабировать производительность"
- Чтобы изменить класс ресурсов для запроса, см. пример изменения класса ресурсов пользователя.
Дальнейшие действия
Дополнительные сведения о повышении производительности в Synapse SQL см. в обзоре производительности.