Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: SQL Server 2022 (16.x) и более поздним версиям
Azure SQL Database
Azure SQL Управляемый экземпляр
SQL база данных в Microsoft Fabric
Упорядоченные индексы columnstore могут обеспечить более высокую производительность, пропуская большие объемы упорядоченных данных, которые не соответствуют предикату запроса. При загрузке данных в упорядоченный индекс columnstore и поддержание порядка при перестроении индекса занимает больше времени, чем в неупорядоченном индексе, индексированные запросы могут выполняться быстрее с помощью упорядоченного columnstore.
Когда запрос считывает индекс columnstore, ядро СУБД проверяет минимальные и максимальные значения, хранящиеся в каждом сегменте столбца. Процесс устраняет сегменты, которые выходят за пределы предиката запроса. Другими словами, он пропускает эти сегменты при чтении данных с диска или памяти. Запрос завершается быстрее, если количество сегментов для чтения и их общий размер значительно меньше.
При использовании определенных шаблонов загрузки данных данные в индексе columnstore могут быть упорядочены неявно без указания условия ORDER. Например, если загрузка данных выполняется каждый день, данные могут быть упорядочены столбцом load_date . В этом случае эффективность выполнения запросов уже может извлечь выгоду из этого неявного порядка. Упорядочение индекса columnstore по одному и тому же load_date столбцу явно в ORDER условии вряд ли даст дополнительное преимущество в производительности.
Сведения о доступности упорядоченного индекса columnstore на различных платформах SQL и версиях SQL Server см. в разделе " Упорядоченная доступность индекса columnstore".
Дополнительные сведения о недавно добавленных функциях для индексов columnstore см. в статье "Новые возможности индексов columnstore".
Упорядоченный и неупорядоченный индекс columnstore
В индексе columnstore данные в каждом столбце каждой группы строк сжимаются в отдельный сегмент. Каждый сегмент содержит метаданные, описывающие его минимальные и максимальные значения, поэтому процесс выполнения запроса может пропускать сегменты, которые выходят за пределы предиката запроса.
Если индекс columnstore не упорядочен, построитель индексов не сортирует данные перед сжатием в сегменты. Это означает, что сегменты с перекрывающимися диапазонами значений могут возникать, что приводит к тому, что запросы считывают больше сегментов для получения необходимых данных. В результате выполнение запросов может требовать больше времени.
При создании упорядоченного columnstore индекса путем указания ORDER предложения в инструкции CREATE COLUMNSTORE INDEX ядро СУБД сортирует данные в каждом сегменте каждого столбца сортировки, прежде чем механизм построения индексов сжимает данные в сегменты. При отсортированных данных перекрытие сегментов уменьшается или устраняется, что позволяет запросам использовать более эффективную ликвидацию сегментов и, следовательно, более высокую производительность, так как есть меньше сегментов и меньше данных для чтения.
Сокращение перекрытия сегментов и повышение производительности запросов
При создании упорядоченного columnstore индекса система управления базами данных пытается отсортировать данные по мере возможности. В зависимости от доступной памяти размер данных, степень параллелизма, тип индекса (кластеризованный и некластеризованный), а также тип сборки индекса (автономный и онлайн), порядок в столбце в индексе columnstore может быть полным без перекрытия сегмента или частично с некоторым сегментом перекрытия. Если есть меньше перекрывающихся сегментов, запрос, который может воспользоваться преимуществами порядка столбцов, выполняется быстрее.
Подсказка
Даже если порядок в столбце индекса columnstore является частичным, сегменты по-прежнему могут быть устранены (пропущены). Полное упорядочение не требуется для получения преимуществ производительности, если частичный порядок избегает множества перекрытий сегментов.
В следующей таблице описывается результирующий тип порядка при создании или перестроении упорядоченного columnstore индекса, в зависимости от параметров создания индекса.
| Предпосылки | Тип заказа |
|---|---|
ONLINE = ON и MAXDOP = 1. |
Полный |
ONLINE = OFF, MAXDOP = 1, и данные для сортировки полностью помещаются в память рабочей области запроса |
Полный |
| Все остальные варианты | Частично |
В первом случае, когда выполняются оба условия ONLINE = ON и MAXDOP = 1, сортировка не ограничивается памятью рабочего пространства запроса, так как при построении упорядоченного columnstore индекса в режиме онлайн используется база данных tempdb для записи данных, которые не помещаются в памяти. Этот подход может замедлить процесс сборки индекса из-за дополнительного tempdb ввода-вывода и требует достаточного свободного места в tempdb. Однако, так как сборка индекса выполняется в сети, запросы могут продолжать использовать существующий индекс, пока создается новый упорядоченный индекс.
Аналогичным образом, при автономном перестроении секционированного индекса columnstore перестроение выполняется поочерёдно, по одному разделу за раз. Другие разделы остаются доступными для запросов.
Если MAXDOP больше 1, каждый поток, используемый для упорядоченного индекса columnstore, работает с подмножеством данных и сортирует его локально. Глобальная сортировка данных, отсортированных различными потоками, отсутствует. Использование параллельных потоков может сократить время создания индекса, но это приводит к более перекрывающимся сегментам, чем при использовании одного потока.
Вы можете создавать или перестраивать упорядоченные индексы columnstore в сети только на некоторых платформах SQL и версиях SQL Server. Дополнительные сведения см. в сводке функций для выпусков продуктов.
В SQL Server онлайновые операции с индексами доступны не во всех выпусках. Дополнительные сведения см. в выпусках и поддерживаемых функциях SQL Server 2025 и выполнении операций индексовв сети.
Для определенных типов данных и кодировок системное представление sys.column_store_segments поможет найти количество перекрывающихся сегментов. Пример скрипта на основе этого представления определяет качество упорядочивания для подходящих столбцов всех индексов columnstore в текущей базе данных.
Производительность запросов
Производительность от упорядоченного индекса columnstore зависит от шаблонов запросов, размера данных, количества перекрывающихся сегментов и вычислительных ресурсов, доступных для выполнения запроса.
Запросы со следующими шаблонами обычно выполняются быстрее с упорядоченными индексами columnstore:
- Запросы с предикатами равенства, неравенства или диапазона.
- Запросы, в которых столбцы предиката и упорядоченные столбцы CCI совпадают.
В следующем примере таблица T1 содержит кластеризованное хранилище столбцов с Col_C, Col_B и Col_A в качестве упорядоченных столбцов.
CREATE CLUSTERED COLUMNSTORE INDEX OrderedCCI
ON T1
ORDER (Col_C, Col_B, Col_A);
Запрос 1 получает преимущества от упорядоченного индекса columnstore больше, чем запросы 2 и 3, так как запрос 1 ссылается на все упорядоченные столбцы в предикате.
-- query 1
SELECT *
FROM T1
WHERE Col_C = 'c'
AND Col_B = 'b'
AND Col_A = 'a';
-- query 2
SELECT *
FROM T1
WHERE Col_B = 'b'
AND Col_A = 'a';
-- query 3
SELECT *
FROM T1
WHERE Col_A = 'a'
AND Col_C = 'c';
Производительность загрузки данных
Производительность загрузки данных в таблицу с упорядоченным индексом columnstore похожа на секционированную таблицу. Загрузка данных может занять больше времени, чем с неупорядоченным индексом columnstore из-за операции сортировки данных, но запросы могут выполняться быстрее после этого.
Добавление новых данных или обновление существующих данных
Новые данные, полученные из пакета DML или операции массовой загрузки в таблице с упорядоченным индексом columnstore, сортируются только в этом пакете. Глобальная сортировка не включает существующие данные в таблице, так как сжатые группы строк в индексе columnstore неизменяемы.
Чтобы уменьшить перекрытие сегментов после вставки новых данных или обновления существующих данных, перестройте индекс columnstore.
Examples
Создание упорядоченного индекса колоночного хранилища
Кластеризованный упорядоченный индекс columnstore:
CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1, Column2);
Некластеризованный упорядоченный индекс columnstore:
CREATE NONCLUSTERED COLUMNSTORE INDEX ONCCI
ON dbo.Table1(Column1, Column2, Column3)
ORDER(Column1, Column2);
Проверка упорядоченных столбцов и порядковый номер.
SELECT OBJECT_SCHEMA_NAME(c.object_id) AS schema_name,
OBJECT_NAME(c.object_id) AS table_name,
c.name AS column_name,
i.column_store_order_ordinal
FROM sys.index_columns AS i
INNER JOIN sys.columns AS c
ON i.object_id = c.object_id
AND c.column_id = i.column_id
WHERE column_store_order_ordinal > 0;
Добавление или удаление столбцов заказа и перестроение существующего упорядоченного индекса columnstore
Кластеризованный упорядоченный индекс columnstore:
CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1, Column2)
WITH (DROP_EXISTING = ON);
Некластеризованный упорядоченный индекс columnstore:
CREATE NONCLUSTERED COLUMNSTORE INDEX ONCCI
ON dbo.Table1(Column1, Column2, Column3)
ORDER(Column1, Column2)
WITH (DROP_EXISTING = ON);
Создание упорядоченного кластеризованного индекса columnstore в Сети с полным порядком в таблице кучи
CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1)
WITH (ONLINE = ON, MAXDOP = 1);
Перестройте упорядоченный кластеризованный индекс columnstore в Сети с полным порядком
CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1)
WITH (DROP_EXISTING = ON, ONLINE = ON, MAXDOP = 1);
Связанный контент
- Рекомендации по проектированию индекса Columnstore
- Индексы Columnstore — руководство по загрузке данных
- Начните работу с индексами колоночного хранения для оперативной аналитики в режиме реального времени
- Индексы Columnstore в хранилище данных
- Оптимизация обслуживания индексов позволяет повысить производительность запросов и снизить уровень потребления ресурсов
- Архитектура индекса columnstore
- Инструкция CREATE INDEX (Transact-SQL)
- ALTER INDEX (Transact-SQL)