В чем разница между кластеризованным и некластеризованным индексом columnstore относительно концепции страницы данных rowstore

  1. В кластеризованном индексе на основе строк: данные всей таблицы (все столбцы) упорядочены по столбцу кластеризованного индекса. Каждая страница содержит определенное количество строк и весь столбец.

  2. В некластеризованном индексе на основе строк - создается структура данных, содержащая столбец индекса. Каждая страница индексированного столбца содержит построчные значения для этого столбца, и каждая строка указывает на (другую страницу) ключевую строку таблицы кластерного индекса или строку кучи (если кластеризованный индекс не существует) для отдыха. данных.

Я понимаю концепцию индекса columnstore - в том смысле, что есть группы строк. Каждая группа строк содержит один сегмент столбца (сжатый) для каждого столбца в таблице, и есть дельта-хранилище для хранения вставок / обновлений до тех пор, пока не будет вызван следующий процесс перемещения кортежа. Основываясь на двух вышеуказанных пунктах индекса rowstore (страница), расскажите, пожалуйста, как это работает в случае кластерного и некластеризованного индекса columnstore.

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


person variable    schedule 12.06.2019    source источник
comment
Ознакомились ли вы с документацией?   -  person Dan Guzman    schedule 12.06.2019
comment
Да, но он не дает никакой информации о концепции страницы, пожалуйста, не могли бы вы мне помочь?   -  person variable    schedule 12.06.2019


Ответы (1)


При сравнении rowstore и columnstore термин кластеризованный означает все столбцы, а некластеризованный означает некоторые столбцы (если только один из них не включает все столбцы). Нет ничего подобного между разрозненными архитектурами организации rowstore / columnstore. Я лично даже не использую слово index, когда говорю о columnstore, поскольку структура оптимизирована для сканирования, а не поиска, и часто приводит к путанице.

Сегменты индекса Columnstore, независимо от того, кластеризованы они или нет, по сути представляют собой просто сжатые большие двоичные объекты данных, хранящиеся в страницах / экстентах. Rowstores, OTOH, имеют структуру записи для каждой строки, чтобы вместить несколько столбцов разных типов и допускающих значения NULL, поэтому они не сжимают так же хорошо, как данные columnstore.

person Dan Guzman    schedule 12.06.2019
comment
Здравствуйте, @Dan, значит ли вы, что - в случае некластеризованного индекса хранилища столбцов индексированный столбец хранится на отдельной странице от страницы таблицы данных? Означает ли это, что концепция некластеризованного индекса columnstore такая же, как концепция некластеризованного индекса rowstore? И значение столбца со страницы индекса, на что они указывают? Страница группы строк? - person variable; 12.06.2019
comment
В случае некластеризованного columnstore в таблице rowstore локатором строк является ключ кластеризованного индекса или страница / строка / слот для кучи. Это тот же указатель, который используется в некластеризованных индексах rowstore. - person Dan Guzman; 12.06.2019
comment
Правильно сказать, что повышение производительности достигается за счет использования индекса хранилища столбцов ТОЛЬКО ЕСЛИ запрос выполняет агрегирование по этому индексированному столбцу? Мое рассуждение заключается в том, что значения индексированных столбцов (хранилища столбцов) будут ближе друг к другу (на одной или нескольких страницах), это будет быстрее для получения данных. В то время как, если запрос должен извлекать данные из нескольких столбцов, он будет сравнительно медленнее, потому что ему нужно получить ключ кластеризованного индекса из индекса хранилища столбцов, чтобы перейти в таблицу хранилища строк для получения дополнительной информации. В этом случае решит ли движок игнорировать индекс колоночного хранилища? - person variable; 05.07.2019
comment
@variable, производительность, вероятно, будет во многом зависеть от того, сколько строк необходимо извлечь из rowstore, чтобы получить результаты, и в идеале оптимизатор должен выбрать, использовать ли индекс columnstore. Даже без агрегирования может быть эффективным сканирование и фильтрация столбцов индекса columnstore, а затем получение столбцов rowstore для окончательного результата. - person Dan Guzman; 05.07.2019