Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Задачи по использованию кластеризованных индексов columnstore в SQL Server.
Общие сведения об индексах columnstore см. в описании индексов Columnstore.
Сведения об кластеризованных индексах columnstore см. в разделе "Использование кластеризованных индексов columnstore".
Содержимое
Создание кластеризованного индекса Columnstore
Чтобы создать кластеризованный индекс columnstore, сначала создайте таблицу rowstore в виде кучи или кластеризованного индекса, а затем используйте инструкцию CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL) для преобразования таблицы в кластеризованный индекс columnstore. Если вы хотите, чтобы кластеризованный колоночный индекс имел то же имя, что и кластеризованный индекс, используйте параметр DROP_EXISTING.
В этом примере создается таблица в виде кучи, а затем преобразуется в кластеризованный индекс columnstore с именем cci_Simple. Это изменяет хранилище для всей таблицы из rowstore в columnstore.
CREATE TABLE T1(
ProductKey [int] NOT NULL,
OrderDateKey [int] NOT NULL,
DueDateKey [int] NOT NULL,
ShipDateKey [int] NOT NULL);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cci_T1 ON T1;
GO
Дополнительные примеры см. в разделе "Примеры" в разделе CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL).
Удаление кластеризованного индекса Columnstore
Используйте инструкцию DROP INDEX (Transact-SQL) для удаления кластеризованного индекса columnstore. Эта операция удаляет индекс и преобразует таблицу columnstore в кучу rowstore.
Загрузка данных в кластеризованный индекс Columnstore
Вы можете добавить данные в существующий кластеризованный индекс columnstore с помощью любого из стандартных методов загрузки. Например, средство массового загрузки bcp, службы Integration Services и INSERT ... SELECT может загружать все данные в кластеризованный индекс columnstore.
Кластеризованные индексы хранилища столбцов используют deltastore, чтобы предотвратить фрагментацию сегментов столбцов в хранилище столбцов.
Загрузка в секционированную таблицу
Для секционированных данных SQL Server сначала назначает каждую строку секции, а затем выполняет операции columnstore с данными в разделе. Каждый раздел имеет собственные группы строк и по крайней мере одно разностное хранилище.
Сценарии загрузки Deltastore
Строки накапливаются в разностном хранилище, пока число строк не является максимальным числом строк, разрешенных для группы строк. Если deltastore содержит максимальное количество строк для каждой группы строк, SQL Server помечает группу строк как "CLOSED". Фоновый процесс, называемый "перемещателем кортежей", находит группу строк CLOSED и перемещает их в хранилище столбцов, где группа строк сжимается в сегменты столбцов и сегменты столбцов хранятся в хранилище столбцов.
Для каждого кластеризованного колоночного индекса может быть несколько разностных хранилищ.
Если дельтахранилище заблокировано, SQL Server попытается получить блокировку в другом дельтахранилище. Если нет доступных разностных хранилищ, SQL Server создаст новое хранилище дельта.
Для секционированных таблиц может быть одно или несколько deltastores для каждой секции.
Только для кластеризованных индексов columnstore описаны следующие сценарии при загрузке строк непосредственно в columnstore или при переходе в deltastore.
В примере каждая группа строк может содержать от 102 400 до 1 048 576 строк на группу.
Строки для массовой загрузки | Строки, добавленные в Columnstore | Строки, добавленные в Deltastore |
---|---|---|
102 000 | 0 | 102 000 |
145,000 | 145,000 Размер группы строк: 145 000. |
0 |
1,048,577 | 1 048 576 Размер группы строк: 1 048 576. |
1 |
2,252,152 | 2,252,152 Размер группы строк: 1 048 576, 1 048 576, 155 000. |
0 |
В следующем примере показаны результаты загрузки 1 048 577 строк в секцию. Результаты показывают наличие одной СЖАТОЙ группы строк в хранилище столбцов (в виде сжатых сегментов столбцов) и одной строки в deltastore.
SELECT * FROM sys.column_store_row_groups;
Изменение данных в кластеризованном индексе Columnstore
Кластеризованные индексы columnstore поддерживают операции вставки, обновления и удаления DML.
Используйте insert (Transact-SQL) для вставки строки. Строка будет добавлена в deltastore.
Удалите строку с помощью DELETE (Transact-SQL ).
Если строка находится в columnstore, SQL Server помечает строку как логически удаленной, но не освобождает физическое пространство для строки, пока индекс не будет перестроен.
Если строка находится в разностном хранилище, SQL Server логически и физически удаляет строку.
Чтобы обновить строку, используйте UPDATE (Transact-SQL).
Если строка находится в columnstore, SQL Server помечает строку как логически удалённую, а затем вставляет обновлённую строку в deltastore.
Если строка находится в deltastore, SQL Server обновляет строку в deltastore.
Перестроение кластеризованного индекса Columnstore
Используйте CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL) или ALTER INDEX (Transact-SQL) для полного перестроения существующего кластеризованного индекса columnstore. Кроме того, можно использовать ALTER INDEX ... ПЕРЕСТРОЕНИЕ для перестроения определенной секции.
Процесс перестроения
Чтобы перестроить кластеризованный индекс columnstore, SQL Server:
Получает монопольную блокировку таблицы или раздела во время перестроения. Данные находятся в автономном режиме и недоступны во время восстановления.
Дефрагментирует столбцовое хранилище путем физического удаления строк, которые были логически удалены из таблицы; удаленные байты восстанавливаются на физическом носителе.
Объединяет данные rowstore в deltastore с данными в columnstore, прежде чем перестроить индекс. После завершения перестроения все данные хранятся в формате столбчатого хранилища, а хранилище дельта-данных пусто.
Повторно сжимает все данные в колоночное хранилище. Существуют две копии индекса columnstore в то время, как выполняется его перестроение. После завершения перестроения SQL Server удаляет исходный индекс columnstore.
Рекомендации по перестроению кластеризованного индекса Columnstore
Перестроение кластеризованного индекса типа columnstore полезно для устранения фрагментации и перемещения всех строк в структуру columnstore. У нас есть следующие рекомендации:
Перестройте раздел вместо всей таблицы.
Перестроение всей таблицы занимает много времени, если индекс большой, и требуется достаточно места на диске для хранения дополнительной копии индекса во время перестроения. Обычно необходимо перестроить только самый недавно используемый раздел.
Для секционированных таблиц не требуется перестроить весь индекс columnstore, так как фрагментация, скорее всего, возникает только в разделах, которые были изменены недавно. Таблицы фактов и большие таблицы измерений обычно секционируются для выполнения операций резервного копирования и управления на блоках таблицы.
Перестройте раздел после тяжелых операций DML.
Перестроение раздела приведет к его дефрагментации и уменьшению объёма дискового пространства. Перестроение удалит все строки из columnstore, помеченные для удаления, и переместит все строки из deltastore в columnstore.
Перестройте раздел после загрузки данных.
Это гарантирует, что все данные хранятся в столбцовом хранилище данных. Если одновременно происходит несколько загрузок, каждый раздел в конечном итоге может иметь несколько deltastores. Перестроение переместит все строки deltastore в columnstore.
Реорганизация кластеризованного индекса Columnstore
Реорганизация кластеризованного columnstore-индекса перемещает все закрытые группы строк в индекс columnstore. Чтобы выполнить реорганизацию, используйте ALTER INDEX (Transact-SQL)с параметром REORGANIZE.
Реорганизация не требуется для переноса закрытых групп строк в columnstore. Процесс перемещения кортежей в конечном итоге найдет все группы строк со статусом "CLOSED" и переместит их. Однако перемещатель кортежей является однопоточным и может не перемещать строковые группы с недостаточной скоростью для вашей рабочей нагрузки.
Рекомендации по реорганизации
Когда следует переорганизовать кластеризованный столбцовый индекс:
- Переорганизуйте кластеризованный индекс columnstore после одной или нескольких загрузок данных, чтобы максимально быстро повысить производительность запросов. Первоначально для реорганизации потребуются дополнительные ресурсы ЦП для сжатия данных, что может замедлить общую производительность системы. Однако, как только данные сжимаются, производительность запросов может улучшиться.