Практика SQL Server

Диагностика columnstore SQL Server по группам строк

Изучите состояния групп, удалённые строки и причины неполного заполнения до изменения загрузки или запуска дорогого обслуживания columnstore.

Columnstore может ускорить большую агрегацию и разочаровать на другой таблице с тем же числом строк. Причина часто связана с физическими группами, читаемыми столбцами и возможностью исключить работу по условиям запроса. Одного факта наличия индекса недостаточно для объяснения результата.

Columnstore особенно полезен для чтения небольшого набора столбцов по множеству строк с агрегацией. Он не автоматически заменяет узкий rowstore-индекс для точечных обращений. Начинайте с формы запросов и нагрузки записи, затем изучайте физическую организацию.

Читаем состояние групп

Сжатая группа может содержать до 1 048 576 строк. Новые данные иногда сначала попадают в rowstore-группы delta store, а сжимаются позднее. Запрос только читает диагностику существующей таблицы фактов.

-- Replace dbo.FactSales with the table being investigated.
SELECT i.name AS IndexName, rg.partition_number, rg.row_group_id,
       rg.state_desc, rg.total_rows, rg.deleted_rows,
       CAST(100.0 * rg.deleted_rows / NULLIF(rg.total_rows, 0)
            AS decimal(6,2)) AS DeletedPercent,
       rg.size_in_bytes, rg.trim_reason_desc
FROM sys.dm_db_column_store_row_group_physical_stats AS rg
JOIN sys.indexes AS i
  ON i.object_id = rg.object_id AND i.index_id = rg.index_id
WHERE rg.object_id = OBJECT_ID(N'dbo.FactSales')
ORDER BY rg.index_id, rg.partition_number, rg.row_group_id;

OPEN и CLOSED обозначают стадии delta store, COMPRESSED содержит колоночные данные. Несколько открытых групп не обязательно являются дефектом, особенно при разных секциях или параллельной загрузке. Наблюдайте динамику, а не один снимок.

Сопоставляйте общее число строк, логические удаления и причины сокращения группы. Большое количество удалённых строк может оставлять работу для записей, больше не участвующих в результате. Небольшая группа бывает следствием ограничения памяти, словаря или маленького входного набора. NULL для процента пустой группы лучше выдуманного корректного деления.

Разрешения зависят от версии: например, VIEW DATABASE STATE в старых версиях и VIEW DATABASE PERFORMANCE STATE начиная с SQL Server 2022. Используйте авторизованное диагностическое соединение, не расширяя без необходимости права приложения.

Связываем структуру с запросом

Рассмотрим месячную агрегацию по категориям.

-- Example report shape for an existing fact table.
SELECT ProductCategoryId, SUM(Revenue) AS Revenue
FROM dbo.FactSales
WHERE SaleDate >= '20260101' AND SaleDate < '20260201'
GROUP BY ProductCategoryId;

Columnstore может не читать ненужные столбцы и пропускать сегменты, чьи границы значений не подходят под фильтр дат. Это отличается от поиска по B-tree. Если каждая группа содержит даты всей истории, узкий месячный диапазон всё равно способен затронуть множество групп.

Изучите фактический план и доступную диагностику прочитанных сегментов. Сравните прочитанные и возвращённые строки, поведение агрегации и выгрузки на диск. Коэффициент сжатия не доказывает сокращения работы. Сам по себе batch mode также не гарантирует удачное размещение.

Организация данных и загрузка влияют на границы сегментов, но сортировка промежуточного запроса не обещает конкретный итоговый физический порядок. Проверяйте получившиеся группы и чтения отчёта. Дополнительно смотрите соединения, раздувающие промежуточный набор: индекс не исправит ошибочное отношение многие ко многим.

Если пользователи преимущественно получают отдельные продажи, рассмотрите дополнительный rowstore-доступ или другую структуру. Измеряйте реальное сочетание операций, включая вставки и обновления, вместо переноса результата одной удобной SUM-агрегации на весь сервис.

Сначала причина, потом обслуживание

Достаточно большие bulk-пакеты могут сразу формировать сжатые группы. В документированном поведении важен порог 102 400 строк. Значение имеет фактический пакет, достигающий каждой секции. Деление большого файла между множеством секций и потоков способно создать гораздо меньшие группы.

Частые крошечные загрузки и повторные обновления увеличивают работу delta store и удалённых строк. Объединяйте поступления, если допустима соответствующая задержка. Принудительное немедленное сжатие каждой маленькой открытой группы, наоборот, может закрепить неудачный размер. Обслуживанию нужна измеримая цель.

Выбирайте реорганизацию или перестроение после определения индекса, секций, пользы и стоимости. Перестроение расходует процессор, память, журнал и временное место, конкурируя с отчётами. Фоновое объединение в некоторых версиях уже способно улучшать часть состояний.

Запишите до и после количество групп, полезные строки, чтения, длительность отчёта и скорость загрузки на сопоставимом периоде. Дополнительно убедитесь, что выигрыш не связан просто с другим объёмом данных или прогретым кэшем. Улучшение должно сокращать работу реальных запросов, сохраняя способность конвейера вовремя загружать новые данные.

Техническая документация: Microsoft Learn: Columnstore overview · Microsoft Learn: Columnstore query performance · Microsoft Learn: Row group physical statistics.

Вопрос по статье

Есть вопрос по этой теме?

Расскажите, что вы оцениваете или с какой проблемой столкнулись. Мы ответим с практической рекомендацией.

Inquiries are not enabled in this preview.

Задать вопрос по этой статье