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

Следствия эффективности соединений


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

К своему удивлению, авторы обнаружили, что часто эти ожидания не оправдываются. На рис. 8 сравнивается производительность варианта C-Store с использованием скрытых соединений, обсуждавшегося в предыдущем пункте, с производительностью на том же рабочем наборе трех вариантов единой денормализованной таблицы, для которой соединения были выполнены заранее. В первом случае в денормализованную таблицу включались без изменения полные строки, такие как названия регионов и стран. В этом случае производительность оказалась в пять раз ниже производительности базового варианта. Это связано с тем, что скрытое соединение преобразует предикаты на атрибутах таблицы измерений в предикаты на значениях внешнего ключа таблицы фактов. Когда таблица денормализуется, предикаты применяются к реальному атрибуту символьных строк таблицы фактов. В обоих случаях применение предиката является доминирующим шагом.
Однако предикат на целочисленном внешнем ключе может вычисляться быстрее предиката на атрибуте со значениями-строками символов, поскольку целочисленный атрибут короче.

Конечно, атрибуты типа символьных строк можно было бы легко перекодировать по словарю в целые числа до денормализации. Когда авторы проделали это (случай «PJ, Int C» на рис. 8), разница в производительности между базовым и денормализованным вариантами стала гораздо меньше. Тем не менее, для довольно многих запросов базовый вариант по-прежнему работал быстрее. Для этого имеются две причины. Во-первых, в некоторых запросах SSBM присутствуют два предиката на одной таблице измерений. Метод скрытых соединений может обобщить результат этого двойного применения предиката как один предикат на атрибуте внешнего ключа таблицы фактов. Однако в денормализованном варианте предикаты должны полностью применяться к обоим столбцам таблицы фактов (напомним, что в хранилищах данных таблица фактов, вообще говоря, гораздо крупнее таблиц измерений, и поэтому применение предикатов к таблице фактов обходится намного дороже, чем их применение к таблице измерений).



Рис. 8. Сравнение производительности основного варианта C-Store с исходной схемой базы данных SSBM с той же C-Store с денормализованным вариантом схемы. Денормализованные столбцы могут быть несжатыми («PJ, No C»), сжатыми по словарю в целые числа («PJ, Int C») или предельно сжатыми («PJ, Max C»).

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


В денормализованном случае столбец предиката и столбец группировки являются разными столбцами таблицы фактов, и по ним обоим требуется производить итерирование, что удваивает объем требуемого ввода-вывода.

В действительности, многие столбцы таблиц измерений базы данных SSBM содержат достаточно мало значений, и их можно сжать до размеров, меньших размеров целочисленных внешних ключей. При использовании в S-Store полного сжатия метод денормализации оказался полезным в большем числе случаев (что показано на рис. 8 как случай «PJ, Max C»).

У этих результатов имеются интересные следствия. Денормализация в течение долгого времени использовалась в системах баз данных для повышения эффективности выполнения запросов за счет уменьшения числа соединений во время исполнения. Вообще говоря, школа мудрости учит нас, что при денормализации за эффективность выполнения запросов приходится платить расширением таблицы и повышением уровня избыточности данных (увеличением размера таблицы на диске и повышением риска появления аномалий обновлений). Можно было бы ожидать, что этот компромисс будет более благоприятным для колоночного хранилища (и денормализация будет использоваться более часто), поскольку при использовании схемы хранения по столбцам перестает быть проблемой один из недостатков денормализации – расширение таблицы. Однако результаты авторов показывают нечто противоположное: денормализация не слишком полезна в колоночных хранилищах (по крайней мере, при использовании звездообразных схем). Это объясняется тем, что скрытые соединения выполняются настолько хорошо, что сокращение числа соединений путем денормализации не дает существенного выигрыша. На самом деле, похоже, что денормализация полезна только в тех случаях, когда атрибуты таблицы измерений, включаемые в таблицу фактов, отсортированы (либо вторично отсортированы) или могут быть сильно сжаты.


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