Columnstore Indexes Described

Индекс columnstore SQL Server в памяти хранит данные и управляет ими с помощью хранилища данных на основе столбцов и обработки запросов на основе столбцов. Индексы Columnstore подходят для рабочих нагрузок хранилища данных, которые выполняют в основном массовую загрузку и запросы только для чтения. Используйте индекс columnstore для повышения производительности запросов максимум в 10 раз относительно традиционного хранилища, основанного на строках, и повышения эффективности сжатия данных до 7 раз относительно несжатых данных.

Примечание

Кластеризованный индекс columnstore рассматривается как стандартный для хранения таблиц фактов с большим объемом данных; ожидается, что он будет полезен в большинстве сценариев хранилища данных. Поскольку кластеризованный индекс columnstore может обновляться, рабочая нагрузка может также выполнять большое число операций вставки, обновления и удаления.

Содержимое

Основы

columnstore index — это технология хранения, получения данных и управления ими с помощью формата хранения данных в один столбец, называемого columnstore. SQL Server поддерживает как кластеризованные, так и некластеризованные индексы columnstore. В обоих используется одна и та же технология columnstore в памяти, но имеются некоторые различия в целях и в поддерживаемых функциях.

Преимущества

Индексы columnstore подходят для главным образом для запросов только для чтения, которые используют для анализа большие наборы данных. Часто эти запросы используются для рабочих нагрузок хранилищ данных. Индексы columnstore обеспечивают значительное повышение производительности для запросов с полным сканированием таблицы и неоптимально подходят для запросов, которые выполняют поиск конкретного значения.

Преимущества использования индекса columnstore.

  • Столбцы часто содержат схожие данные, что приводит к высокой степени сжатия.

  • Высокие степени сжатия повышают производительность запросов с помощью малого отпечатка в памяти. В свою очередь, производительность запросов может повыситься, так как SQL Server может выполнять больше операций с запросами и данными в памяти.

  • Новый механизм выполнения запроса, который называется пакетным выполнением. Появление этого режима в SQL Server позволило значительно снизить загрузку ЦП. Выполнение пакета тесно интегрировано и оптимизировано для взаимодействия с форматом хранения columnstore. Выполнение пакета иногда называется выполнением на основе векторов или векторизированным.

  • Часто запросы выбирают только несколько столбцов из таблицы, что сокращает общее число операций ввода-вывода для физического носителя.

Версии columnstore

SQL Server 2012, SQL Server 2012 Parallel Data Warehouse и SQL Server 2014 используют индексы columnstore для ускорения выполнения общих запросов хранилищ данных. SQL Server 2012 году появились две новые функции: некластеризованный индекс columnstore и возможность выполнения запросов на основе векторов, которая обрабатывает данные в единицах, называемых "пакетами". SQL Server 2014 имеет функции SQL Server 2012, а также обновляемые кластеризованные индексы columnstore.

Ключевые характеристики

Применимо к: SQL Server 2014–SQL Server 2019 (15.x).

В SQL Server кластеризованный индекс columnstore:

  • Доступен в выпусках Enterprise, Developer и Evaluation.

  • Обновляется.

  • Это основной метод хранения для всей таблицы.

  • Не имеет ключевых столбцов. Все столбцы являются включенными.

  • Является единственным индексом для таблицы. Не поддается объединению с другими индексами.

  • Можно настроить для использования columnstore или архивного сжатия columnstore.

  • Физически не хранит столбцы в отсортированном порядке. Вместо этого хранит данные для повышения сжатия и производительности.

Применимо к: SQL Server 2012–SQL Server 2019 (15.x).

В SQL Server некластеризованный индекс columnstore:

  • Поддерживается индексация подмножества столбцов в кластеризованном индексе или куче. Например, его можно использовать для индексации часто используемых столбцов.

  • Требует дополнительного места для хранения копии столбцов в индексе.

  • Обновляется путем перестроения индекса или переключения секций. Его невозможно обновить с помощью операций DML, таких как вставка, обновление и удаление.

  • Может быть совмещен с другими индексами из таблицы.

  • Можно настроить для использования columnstore или архивного сжатия columnstore.

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

Ключевые концепции и понятия

Следующие основные концепции и понятия связаны с индексами columnstore.

индекс columnstore Индекс columnstore — это технология для хранения, получения данных и управления ими с помощью формата данных столбцов, называемого columnstore. SQL Server поддерживает как кластеризованные, так и некластеризованные индексы columnstore. В обоих используется одна и та же технология columnstore в памяти, но имеются некоторые различия в целях и в поддерживаемых функциях.

columnstore. Columnstore — это данные, логически упорядоченные в виде таблицы со строками и столбцами и физически хранящиеся в столбцовом формате данных.

rowstore. Хранилище строк — это данные, логически упорядоченные в виде таблицы со строками и столбцами, а затем физически хранящиеся в формате данных на уровне строк. Это стандартный способ хранения реляционных данных таблиц.

группы строк и сегменты столбцов. Для высокой производительности и высокого уровня сжатия индекс columnstore разбивает таблицу на группы строк, называемые группами строк, а затем сжимает каждую группу строк по столбцам. Число строк в группе строк должно быть достаточно большим, чтобы повысить скорость сжатия, и достаточно малым для использования преимуществ использования операций в памяти.

группа строк. Группа строк — это группа строк, которые одновременно сжимаются в формат columnstore.

сегмент столбца Сегмент столбца — это столбец данных из группы строк.

  • Группа строк обычно содержит максимальное число строк для группы строк, 1 048 576 строк.

  • Каждая rowgroup содержит один сегмент столбца для каждого столбца в таблице.

  • Каждый сегмент столбца сжимается одновременно и сохраняется на физическом носителе.

Сегмент столбца

некластеризованный индекс columnstore Некластеризованный индекс columnstore — это индекс, доступный только для чтения, созданный в существующей кластеризованной таблице или таблице кучи. Он содержит копию подмножества столбцов вплоть до включения всех столбцов в таблице. Таблица доступна только для чтения, но содержит некластеризованный индекс columnstore.

Некластеризованный индекс columnstore дает возможность использования индекса columnstore для выполнения запросов анализа, выполняемых одновременно с операциями только для чтения в исходной таблице.

Некластеризованный индекс columnstore

кластеризованный индекс columnstore. Кластеризованный индекс columnstore — это физическое хранилище для всей таблицы и единственный индекс для таблицы. Кластеризованный индекс можно обновлять. Можно выполнять операции вставки, удаления и обновления индекса, а также выполнять массовую загрузку данных в индекс.

Кластеризованный индекс columnstore

Чтобы снизить фрагментацию сегментов столбцов и повысить производительность, индекс columnstore может некоторые данные сохранить временно в таблице, которая называется deltastore, и использовать сбалансированное дерево идентификаторов для удаленных строк. Операции deltastore обрабатываются в фоновом режиме. Для получения правильных результатов запросов кластеризованные индексы columnstore объединяют результаты запроса от columnstore и deltastore.

deltastore. Используется только с кластеризованными индексами columnstore, deltastore — это таблица rowstore, в котором хранятся строки, пока количество строк не станет достаточно большим для перемещения в columnstore. Deltastore используется с кластеризованными индексами columnstore для повышения производительности при загрузке и других операциях DML.

При крупной массовой загрузке большинство строк переходят непосредственно в columnstore без промежуточного помещения в deltastore. Некоторых строк в конце массовой загрузки может оказаться слишком мало для соответствия минимальному размеру rowgroup, составляющему 102 400 строк. В этом случае последние строки переходят в deltastore вместо columnstore. Для небольших массовых загрузок с менее 102 400 строк, все строки перемещаются напрямую в deltastore.

Когда объем deltastore достигает максимального числа строк, оно закрывается. Процесс перемещения кортежей выполняет проверку на наличие закрытых групп строк. При обнаружении закрытой группы строк оно уменьшает его и сохраняет в columnstore.

Загрузка данных

Загрузка данных в некластеризованный индекс columnstore

Чтобы загрузить данные в некластеризованный индекс columnstore, сначала загрузите данные в традиционную таблицу rowstore, хранящуюся в виде кучи или кластеризованного индекса, а затем создайте некластеризованный индекс columnstore с помощью инструкции CREATE COLUMNSTORE INDEX (Transact-SQL).

Загрузка данных в индекс columnstore

Таблица с некластеризованным индексом columnstore доступна только для чтения до тех пор, пока индекс не будет удален или отключен. Чтобы обновить таблицу и некластеризованный индекс columnstore, можно переключать секции. Вы также можете отключить индекс, обновить таблицу, а затем перестроить индекс.

Дополнительные сведения см. в разделе Using Nonclustered Columnstore Indexes.

Загрузка данных в кластеризованный индекс columnstore

Загрузка в кластеризованный индекс columnstore

Как показано на схеме, чтобы загрузить данные в кластеризованный индекс columnstore, SQL Server:

  1. Вставляет rowgroup максимального размера непосредственно в columnstore. При загрузке данных SQL Server назначает строки данных в порядке первой очереди в открытую группу строк.

  2. После достижения максимального размера для каждой группы строк SQL Server:

    1. Отмечает rowgroup как CLOSED.

    2. Обходит deltastore.

    3. Сжимает каждый сегмент столбца в rowgroup сжатием columnstore.

    4. Физически сохраняет каждый сжатый сегмент столбца в columnstore.

  3. Вставляет оставшиеся строки в columnstore или deltastore следующим образом.

    1. Если число строк удовлетворяет требованию к минимальному числу строк для rowgroup, строки добавляются к columnstore.

    2. Если число строк меньше минимального числа строк для rowgroup, строки добавляются к deltastore.

Дополнительные сведения о задачах и процессах deltastore см. в разделе Using Clustered Columnstore Indexes.

Советы по производительности

Планирование достаточного объема памяти для параллельного создания индексов columnstore

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

Объем памяти, необходимый для создания индекса columnstore, зависит от количества столбцов, числа столбцов строкового типа, степени параллелизма (DOP) и характеристик данных. Например, если в таблице имеется менее миллиона строк, то SQL Server будет использовать всего один поток для создания индекса columnstore.

Если в таблице более миллиона строк, но SQL Server не может получить объем памяти, достаточный для создания индекса с помощью MAXDOP, то SQL Server автоматически уменьшит MAXDOP в соответствии с наличием памяти. В некоторых случаях необходимо уменьшить DOP до одного для создания индекса в условиях нехватки памяти.

Некластеризованные индексы columnstore

Дополнительные сведения о стандартных задачах см. в разделе Using Nonclustered Columnstore Indexes.

Кластеризованные индексы columnstore

Дополнительные сведения о стандартных задачах см. в разделе Using Clustered Columnstore Indexes.

Метаданные

Все столбцы в индексе columnstore хранятся в метаданных как включенные столбцы. Индекс columnstore не имеет ключевых столбцов.