すっかり当たり前になった、列指向データベース
皆さんはHP Vertica(以下、Vertica)というデータベースをご存知でしょうか?Verticaは大量のデータを分析するような情報系システムで利用されているデータベースで、いわゆる「列指向(カラムナー)」に分類されます。最も有名なのが2012年のアメリカ大統領選挙での事例で、民主党のバラク・オバマ氏を支援するWebサイト「Obama for America」のデータ分析にVerticaが使われました。また、HP社自身もVerticaを利用しており、「hp.com」において15ヵ月分のクリックストリームデータや5年分の購買データを分析しています。また、ビッグデータ分析だけではなく、いわゆる企業内のDWHとしての活用実績も数多くあります。「今、何が起きているのか」「今後、何が起きそうか」といった戦略的で、スピーディな意思決定を支えているのが、Verticaというデータベースなのです。
ただ、列指向という仕組み自体は、もはや珍しいものではありません。数年前であれば確かに「行指向より○○倍速い」といったキーワードがもてはやされましたが、現在では市場の成熟とともに行指向データベースが列指向の機能を取り入れたり、クラウド上で列指向データベースをPaaSとして提供するプレイヤーが増えてきました。かつて主流だったDWH専用アプライアンス型を導入した企業でも、時代の変化とともに改めて製品を選定しなおすという動きが増えているように感じます。
こうした選択肢の増加はユーザにとって喜ばしいことですが、逆に製品やサービスが増えすぎて個々の良し悪しや特徴がわかりにくくなっています。例えば、列指向データベースの製品紹介やプレゼンテーション資料を見ると、大抵の場合は以下のような特徴が書かれています。
このように、ほとんど似たような特徴が書かれているので、カタログスペック上での比較は非常に困難です。また、ベンチマーク結果の公開を禁じている製品がほとんどで、さらに価格が非公開な場合もあります。ただでさえ情報系システムは正当な投資コストを算出して予算化するのが難しいと言われているのに、限られた情報で検討を進めていくとなると、採用までの道のりは困難を極めます。とは言え、全ての製品を評価・検証する時間はもちろんないので、その製品だけが明らかに優れている“尖った”部分をまずは探していかなければなりません。
そこで本稿では、一般的な列指向データベースとVerticaが明らかに違う点を中心に解説します。
※列指向データベースの一般的な特徴については、こちらのサイトをご参照ください。
Vertica最大の特徴はプロジェクション
Verticaでは、テーブルは論理スキーマとして存在し、実データは「プロジェクション」というオブジェクトに格納されます。これは、一般的な列指向データベースと明らかに違う点です。データはプロジェクション内で、クエリに必要な列だけが圧縮・ソートされた状態になっています。プロジェクション(射影)というと、データベースの世界では「表から条件に合う列を取り出す操作」のことを指しますが、Verticaの場合はこの射影が最初から行われた状態になっていると考えればわかりやすいのではないでしょうか。Verticaはコンピュータ界のノーベル賞とも言われるチューリング賞を今年(2015年)受賞したマイケル・ストーンブレーカー博士が開発に携わった「C-Store」を起源とするデータベースで、読み取りを効率化/高速化するための設計思想が他のデータベースとは大きく異なっています。
まずは、プロジェクションについて詳しく説明します。Veticaでは、表を作成するとスーパープロジェクションというオブジェクトが自動的に作成されます。スーパープロジェクションは全ての列を含んでおり、データは列ごとに圧縮・ソートされた状態になっています。この段階でかなり効率的な状態でデータが格納されているため、このままでもSQLはかなり高速に処理されます。(Database Designerというツールで圧縮率とソート順を最適化するとより高速になります)。
しかし、Verticaが面白いのは、この状態から特定のクエリだけを速くするために追加のプロジェクションを作成できるところです。「特定の列だけを含むもの」「すでに結合してあるもの」「すでに集計処理されているもの」というように、あらかじめクエリを意識したプロジェクションを作成しておくことで、性能を限界まで高めることができるのです。
※各プロジェクションの詳細はVertica技術情報サイトをご参照ください。
では、プロジェクションの効果を検証してみましょう。図3は、同じハードウェア上にStar Schema Benchmark(DWH系処理のベンチマーク)のデータを1TB分用意し、全ての列を含むスーパープロジェクションと、クエリに必要な列だけを含むクエリスペシフィックのプロジェクションで性能を比較した結果です。先ほど説明したように、スーパープロジェクションのみでも従来の行指向データベースと比較してかなり高速な結果になりました。しかし、Verticaならではのクエリスペシフィックを使用すると、さらに大幅な高速化ができることがわかります。
これがVerticaの“尖った”部分の一つであるプロジェクションの効果です。一般的なデータベースでは索引を作成したり、あるいは列のソート順を変えることでチューニングを行いますが、Verticaの場合はプロジェクションを作成するだけです。作成も簡単で、Database DesignerにSQL文(テキスト)を渡せば、自動的に最適なプロジェクションがデザインされます。もちろん、無闇にプロジェクションを作りすぎないよう気をつけなければなりませんが、クエリの応答時間をこれだけ短くできる選択肢は他のデータベースではなかなか見られません。「とにかくこの処理だけは速くしたい」という場合には、プロジェクションが非常に有効です。