СУБД с хранением данных по столбцами и по строкам

Покортежные накладные расходы и стоимость соединений


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

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

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



Содержание раздела