6. Эксперименты
В этом разделе с использованием тестового набора SSBM сравнивается производительность реализаций, основанных на использовании строчного хранилища, с производительностью C-Store. Целью экспериментов является обеспечение ответов на следующие четыре вопроса:
- как соотносится производительность различных реализаций колоночного хранилища на основе строчного хранилища с производительностью базового варианта C-Store?
- можно ли получить какие-либо преимущества от использования физической схемы, ориентированной на столбцы, в неизмененном строчном хранилище?
- какие оптимизации, предложенные для колоночных хранилищ (сжатие, отложенная материализация, блочная обработка), являются наиболее существенными?
- как соотносятся стоимость выполнения соединений в колоночной базе данных со звездообразной схемой с использованием метода скрытых соединений со стоимостью выполнения тех же запросов над денормализованной таблицей фактов с предварительно вычисленными соединениями?
Отвечая на эти вопросы, авторы статьи предоставляют разработчикам СУБД, заинтересованным в применении подхода с хранением данных по столбцам, информацию относительно того, какие методы оптимизации наиболее плодотворно действуют на производительность. Кроме того, эти ответы помогут понять, какие изменения требуется сделать на уровнях менеджера хранения данных и исполнителя запросов строчных хранилищ, чтобы в них можно было успешно моделировать колоночное хранилище.
Все эксперименты поводились с использованием рабочей станции с двухядерным процессором Pentium, работающим на частоте 2.8 GHz, с тремя гигабайтами оперативной памяти. В качестве операционной системы использовалась ОС RedHat Enterprise Linux 5. Машина была оснащена дисковым массивом с четырьмя дисками, управляемым как одним логическим томом. Файлы «расслаивались» между дисками. Типичная пропускная способность ввода/вывода составляла 40-50 мегабайт в секунду на один диск, или 160-200 мегабайт в секунду для расслоенных файлов. Приводимые числовые результаты усреднены на основе нескольких прогонов и основываются на использовании «разогретого» буферного пула (на практике авторы обнаружили, что для обоих видов систем это приводит примерно к тридцатипроцентному повышению производительности; этот выигрыш не очень велик, поскольку объем данных, считываемых с диска при выполнении каждого запроса, превышает размер буферного пула).
6.1. Побудительные мотивы выбора экспериментальной установки
На рис. 5 приведено сравнение производительности C-Store и System X на тестовом наборе Star Schema Benchmark. Авторы призывают читателей не обращать слишком пристального внимания на абсолютные показатели производительности этих двух систем. Как обсуждается в этом разделе, реализации этих систем существенно различаются (даже если не принимать во внимание основное различие в строчной или колоночной ориентации), и эти различия влияют на числовые показатели производительности.
![](img5.gif)
Рис. 5. Базовая производительность C-Store (CS) and System X (RS) в сравнении со случаями применения в каждой системе материализованных представлений
На этом рисунке «RS» соответствует числовым показателям базового варианта System X, «CS» – показателям базового варианта C-Store. «RS (MV)» соответствует показателям System X при использовании оптимального набора материализованных представлений, которые содержат минимальные проекции таблиц, требуемых для выполнения каждого запроса (см. разд. 4). Как видно, C-Store превосходит по производительности System X в шесть раз в базовом варианте и в три раза, когда в System X используются материализованные представления. Это согласуется с результатами предыдущих исследований, которые показывают, что колоночные хранилища существенно превосходят по производительности строчные хранилища на рабочих нагрузках хранилищ данных [2, 9, 22].
Однако четвертый набор показателей, представленный на рис. 5, показывает, что к числовым показателям, которые используются для сравнения производительности систем, нужно относиться осторожно. Для получения четвертого набора показателей авторы использовали внутри C-Store те же самые (строчные!) материализованные представления. Можно было бы ожидать, что менеджер хранения данных C-Store не сможет сохранить строчные данные, потому что, в конце концов, он ориентирован на хранение данных в столбцах. Однако это можно легко сделать путем использования таблиц с единственным столбцом типа символьных строк. Значениями этого столбца являются полные кортежи. Можно было бы также ожидать, что компонент выполнения запросов C-Store не сможет работать со строками, поскольку он ориентирован на использование столбцов в качестве вводных данных. Однако, как пояснялось в подразделе 5.2, в C-Store строки являются законным внутренним представлением; в некоторой точке плана выполнения запроса C-Store конструирует строки из столбцов-компонентов (поскольку пользовательский интерфейс с РСУБД является покортежным). После выполнения этого конструирования кортежей продолжается выполнение оставшейся части плана запроса с использованием стандартных операций строчного хранилища [5]. Таким образом, оба варианта систем CS (Row-MV) и RS (MV) выполняли одни и те же запросы над одними и теми же данными, хранимыми одинаковым образом. Следовательно, можно было бы ожидать, что показатели производительности также окажутся одинаковыми.
Вопреки этим ожиданиям производительность System X оказалась существенно выше (более чем в два раза) производительности C-Store. Если немного задуматься, то это перестает быть удивительным – в компании, производящей System X, имеются специальные группы, отвечающие за поиск и устранение в коде узких мест производительности, в то время как в C-Store имеется несколько известных узких мест производительности, которые еще не устранены [3]. Более того, в CStore, как в простом прототипе, не реализованы развитые средства повышения производительности, содержащиеся в System X. К числу таких средств относятся разделение (partitioning) и многопотоковость (multi-threading). System X может оптимально разделить каждое материализованное представление в расчете на звено запросов, для которого оно предназначается. При работе системы на одной машине разделение повышает производительность за счет уменьшения объема данных, которые нужно просканировать для выполнения запроса. Например, материализованное представление, используемое для первого звена запросов, разделяется по годам даты принятия заказа, что полезно, поскольку в каждом запросе этого звена имеется предикат на столбце orderdate
. Чтобы определить, какие преимущества в производительности получает System X от разделения, авторы пропустили тот же тестовый набор над теми же материализованными представлениями без их разделения. В этом случае среднее время выполнения запроса составило 20.25 секунд. Тем самым, разделение обеспечило System X двухкратный выигрыш в производительности (хотя это зависит от конкретного запроса; дальнейшее обсуждением см. в подразделе 6.2). Кроме того, в C-Store отсутствует поддержка многопотокового режима, и, следовательно, невозможно использование второго ядра процессора.
Таким образом, между двумя системами, с которыми экспериментировали авторы, имеется много различий. Некоторые из них являются фундаментальными различиями между колоночными и строчными хранилищами, другие связаны с особенностями реализации. Поскольку трудно придти к полезным заключениями при сравнении показателей производительности настолько разных систем, авторы выбрали другую тактику, анализируя производительность выполнения тестового набора с двух точек зрения. В подразделе 6.2 описывается попытка моделирования колоночного хранилища внутри строчного хранилища. В этом подразделе обсуждаются эксперименты с использованием только System X, и поэтому удается избежать проблем кросс-системного сравнения производительности. В подразделе 6.3 описываются эксперименты по удалению из C-Store оптимизаций, воздействующих на производительность. Этот процесс «разгрузки» C-Store продолжался до тех пор, пока она не начала показывать производительность строчного хранилища. И здесь эксперименты проводились только над одной системой.
Выполнение экспериментов в такой манере позволяет авторам придти к некоторым выводам о преимуществах колоночных хранилищ в отношении производительности, не полагаясь на сравнение систем. Например, интересно отметить, что на рис. 5 производительность вариантов CS и CS Row MV различается более чем в шесть раз, несмотря на то, что используется одна и та же система, и в обоих вариантах с диска считывается минимальный набор столбцов, требуемых для обеспечения ответа на запрос. Из этого ясно видно, что преимущество в производительности колоночное хранилище получает далеко не только потому, что с диска не считываются лишние данные. Причины этой разницы в производительности вариантов CS и CS Row MV разъясняются в подразделе 6.3.