基幹系システムで慣れ親しんできた汎用データベースですが、大量データの検索/集計処理を主とする情報系システムで利用した場合、チューニングコストが大きくなるという課題があります。これらの課題を高性能なハードウェアと専用ソフトウェアの組み合わせで解決したのがDWHアプライアンスですが、導入コストによって採用を見送るケースも少なくありません。
近年、大規模なデータを高速かつ高い頻度で分析するニーズは広がりをみせており、それに応えるべく登場したのが、Verticaなどの検索機能特化型の列指向型データベースです。


列でデータを保持し、必要な列のみアクセス

汎用データベースが行単位で行うのに対して、列指向型データベースは列単位にデータの格納とアクセスを行います。
以下の図の例では、注文表から注文日が2011年の行を対象に売上高(価格×数量)を集計する処理を行っています。注文日と価格、数量を取り出すだけで結果を導くことができるため、対象となる3つの列が格納されているデータ領域にのみアクセスすることで、行ベースでデータが格納されている場合と比較して、無駄なディスクI/Oを省き処理性能を向上させることができます。データベースにおける最大のボトルネックはディスクI/Oです。一般的に、処理時間の2/3~4/5はディスクI/Oとなっており、そのディスクI/Oを減らすことで性能向上を図るのが列指向型データベースのアプローチです。

column-oriented-database-suitable-01


それでは、無駄なI/Oが、実際のところどの程度なのかを考えてみます。

ブロック内には、列データとは別に、ブロックヘッダと行ヘッダが含まれています。そのため、1ブロックに格納できる行数は、各種ヘッダ部分を除いた「ブロック・サイズ÷行サイズ」で計算できます。

例えば、

・ブロック・サイズ = 8KB
・行サイズ = 100バイト
・データ件数 = 1億件
・必要な列の合計サイズ = 20バイト


だとしたら、

・ブロックに格納される行数 = 80行(8KB÷100バイト)
・全件アクセス時のI/O数 = 125万ブロック(1億件÷80行)
・アクセスしたい列のI/O数 = 25万ブロック(125万ブロック×(20バイト÷100バイト))
・無駄なI/O数 = 100万ブロック(125万ブロック – 25万ブロック)


ということになります。言い換えれば、

2GB(25万ブロック×8KB)のデータを分析するのに、10GB(125万ブロック×8KB)ものデータを読み込んで、その内8GB(100万ブロック×8KB)のデータを捨てている

ということです。
情報系システムではこのような処理がほとんどのため、汎用データベースを使うのはかなりもったいないといえます。列指向型データベースなら無駄な列にはアクセスしないため、それだけでも数倍は処理が速いのは誰でもわかりますね。


列方向で効率の良いデータ圧縮

列指向にはもう1つメリットがあります。それはデータ圧縮です。以下の図のように、列単位にデータを格納することで、同じ領域内に同一データが集まります。例えば、性別は2種類で、年齢や都道府県は数10種類ありますが、これらのデータは重複して存在します。このように重複データが多いとデータ圧縮の効果が非常に高く、データ領域をコンパクトに抑えることができます。さらに、領域サイズが小さいと、該当する列からのデータ抽出時のディスクI/Oも減らすことができるため、性能向上にも一役買っています。

当然ですが、圧縮すると解凍も必要になります。解凍処理も列単位で行えるため、無駄な列データまで解凍することがなく、CPU負荷を抑えて効率的に行うことができます。

column-oriented-database-suitable-02


以上のように、列指向型データベースは行ベースの汎用データベースと比べ、情報系システムにおける優位性を持ちます。

Verticaは列指向の特性を持ちつつ、さらに進化した検索機能特化型データベースです。


参考情報

他の列指向型データベースにないVerticaの優位性については、こちらの記事でご紹介します。

・Verticaとは
 http://vertica-tech.ashisuto.co.jp/about-vertica/