TOP>企業情報>コラム>技術情報>DWH系処理に汎用DBMSを利用する課題 Vol.2

DWH系処理に汎用DBMSを利用する課題 Vol.2

前回はDWH系処理に汎用DBMSを利用する課題について検討しました。第2回目となる今回は、DWH系処理に適した列指向DBMSの優位性について、「InfiniDB」の紹介をとおして解説します。

(全3回連載)

Vol.2 DWH系処理に適した列指向DBMSの優位性

DWHで使用するDBMSの選択肢


前回ご紹介のとおり、汎用DBMSは使い慣れている利点がある一方で、DWH系処理ではチューニング・コストが大きくなるという課題があります。これらの課題を高性能なハードウェアと専用ソフトウェアの組み合わせで解決したのがDWH専用アプライアンスですが、導入コストによって採用を見送るケースも少なくありません。近年、大規模なデータを高速かつ高い頻度で分析するニーズは広がりをみせており、それに応えるべく登場したのが、今回ご紹介する「InfiniDB」などのDWH専用ソフトウェアです。

今回ご紹介する「InfiniDB」は、データをロードするだけで、ユーザが期待するパフォーマンスを実現可能なアーキテクチャが採用されています。そのため、索引を用いたSQLチューニングや、表の各列が保持するデータに合わせて最適な索引を選ぶ作業、索引をメンテナンスする時間も必要ありません。その結果、開発/運用担当者だけでなく、DWHを利用するエンドユーザのストレスを大幅に軽減することができます。

それでは、手間と時間とコストを省き、高いパフォーマンスを発揮する「InfiniDB」とは一体どのようなDBMSなのか、その特長についてご紹介します。

「InfiniDB」の3つの特長


「InfiniDB」には、次の3つの特長があります。

Fast

Fast(高速)

「InfiniDB」は、データ抽出にかかるディスクI/Oを最小レベルに絞り込み、さらに与えられたマシン・リソースを限界まで使い切ることで、非常に高いパフォーマンスを提供します。

Simple

Simple(簡単)

「InfiniDB」は、索引などによるパフォーマンス・チューニングを必要としません。パフォーマンス要件を満たすための高度で複雑なデータベース設計や、システム維持にかかるコストを大幅に削減します。

Scalable

Scalable(拡張可能)

拡張性は製品選定における重要な要素の1つです。「InfiniDB」はスモールスタートにより、初期投資のリスクを軽減し、システムの用途拡大に合わせ、柔軟で拡張性の高い選択肢を提供します。

それでは、なぜシンプルなのに高速に検索処理が行えるのか、列指向の特長などにも触れながら解説します。

列指向(垂直パーティション)


汎用DBMSが行単位で行うのに対して、列指向DBMSの「InfiniDB」は列単位にデータの格納とアクセスを行います。

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

図1:垂直パーティション

図1:垂直パーティション

列指向(データ圧縮)


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

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

図2:データ圧縮

図2:データ圧縮

ここまでが、列指向DBMSで共通するDWH系処理における優位性になります。ここからは、さらにDWHシステムの課題に特化して進化した「InfiniDB」の特性について解説します。

データ格納形式


データ格納形式について、もう少し掘り下げてご紹介します。図3のように、データは最小単位として「ブロック」という領域に格納されます。そのブロックが複数集まって「エクステント」という単位が構成されます。さらにエクステントが複数集まって「セグメント」という単位(ファイル)が構成されます。汎用DBMSの用語と類似していますが、大きな違いはブロック、エクステントが列ごとに存在しているという点です。

図3:データ格納形式

図3:データ格納形式

エクステントマップ(水平パーティション)


「InfiniDB」では、「エクステントマップ」というエクステントごとのデータ内容を管理する辞書の仕組みを持っています。図4のように、エクステントマップは各エクステントに格納された列データの最大値と最小値を保持し、どのエクステントに、どんなデータが格納されているかを把握しています。データ・アクセス時には、このエクステントマップを参照し、アクセス対象のエクステントを絞り込んで取り出すことができます。イメージは縦と横でデータをバラバラに分割し、必要な部分だけを取り出す構造体です。エクステントマップにより行単位の絞り込みが可能となるため、索引を用いなくても高い性能を発揮します。

図4のエクステントマップを例に挙げると、ある特定の顧客ID(例:930)を参照する場合、顧客IDのエクステントマップよりエクステント3へのアクセスが必要であることがわかります。このように「InfiniDB」では、垂直&水平パーティションが自動的に行われることにより、無駄なディスクI/Oを減らし、シンプルで高速なパフォーマンスを実現しています。

図4:エクステントマップ

図4:エクステントマップ

・垂直&水平パーティションの具体例

垂直(列指向による)&水平(エクステントマップによる)パーティションの具体例を見てみましょう。次のようなSQLを実行したとします。

(1)検索対象ではないc列、d列を除外

SQL


まず、このSQLでアクセスが必要な列は表内のa列とb列だけです。そのため、検索処理の対象外となっているc列とd列はアクセス対象から除外されます。これ以降、アクセス対象から除外されたエクステントについては、図5のc列、d列のエクステントのように色付けをします。

図5:エクステントの絞り込みイメージ(1)

図5:エクステントの絞り込みイメージ(1)

ここまでは他の列指向DBMSと同じですが、ここからが「InfiniDB」の真骨頂となります。

(2)a列の条件値の範囲外を除外

SQL


「InfiniDB」は、アクセス対象の列データをすべて読み込むことはありません。WHERE句の条件式を見ると、a列に対して絞り込みがされています。そのため、エクステントマップの最小値と最大値と、a列の条件値を確認し、a列で読み込む必要があるエクステントを絞り込みます。図6の例では、緑色のエクステントは今回読み込む必要がないと判断され、アクセス対象から除外されました。

図6:エクステントの絞り込みイメージ(2)


(3)b列の条件値の範囲外を除外

SQL


同様の処理がb列に対しても行われます。その結果、図7のように、b列の中のエクステントに対しても、絞り込みが行われました。

図7:エクステントの絞り込みイメージ(3)


(4)and条件の範囲外を除外

SQL


この例ではWHERE句がAND条件で結ばれているため、図8のように、両方の条件を満たさないエクステントについても、アクセス対象から除外されます。

図8:エクステントの絞り込みイメージ(4)

図8:エクステントの絞り込みイメージ(4)


(5)絞り込まれたエクステントのみアクセス

SQL


最終的に処理で必要となるエクステントは、図9のように4つのエクステントに絞り込まれます。これが列方向(垂直)だけでなく、行方向(水平)でも絞り込む仕組みになります。

図9:エクステントの絞込みイメージ(5)

図9:エクステントの絞込みイメージ(5)

InfiniDBはデータをロードするだけで、必要なデータに効率的にアクセスできるという仕組みになっていることをご理解いただけたのではないでしょうか。

自動マルチスレッド処理


さらにもう1つ、「InfiniDB」が高速な理由があります。それは、ハードウェアが持っているリソースと性能を100%引き出すための最適化がされていることです。

図10のように、「InfiniDB」はマルチスレッド機能により、サーバのCPUコアをすべて利用してデータ・アクセスを行います。しかも自動でパラレル化を行うため、ユーザ側では何も意識する必要がありません。CPUコアが多ければ多いほど並列度は高くなるため、処理性能はリニアに向上します。

図10:自動マルチスレッド処理

図10:自動マルチスレッド処理

ここまでで、3つのキーワード「列指向/エクステントマップ/マルチスレッド」をご紹介しました。垂直&水平パーティションによるデータの絞り込みとデータ・アクセスにおけるパラレル処理の自動化が、「InfiniDB」がシンプルで高速な理由です。

続いて、「InfiniDB」の基本構成やその他の特長についてご紹介します。

「InfiniDB」の基本構成


「InfiniDB」は、図11のように、MySQLアーキテクチャをベースに「User Module」(以下、UM)と「Performance Module」(以下、PM)という2つのモジュールから構成されています。この2つを言い換えると、UMはMySQLでいう「SQLエンジン」、PMはMySQLでいう「ストレージ・エンジン」に該当します。「InfiniDB」はこの2つのモジュールを柔軟に配置し、MapReduce(マップリデュース)のような動作をすることで、高速にデータ抽出を行います。

UMはクライアントからの接続要求を受け付け、SQL構文の解析、実行計画の策定、そして結果セットをクライアントへ返信する処理の他、アクセス対象データの絞り込みや、PMからの結果セットの受け取り、その後の集計を実行する役割を担っています。

一方、PMはUMからのリクエストを受け取り、ディスクからデータを抽出する役割を担います。また、PMの特長は、高速にデータを抽出するためのマルチスレッド動作とI/O処理に特化したアーキテクチャにあります。これにより、超高速でのデータ処理が可能となるため、驚きの速さで結果セットをUMに戻すことができます。

さらに、「InfiniDB」は、MySQLにて提供されるクライアント・アダプタを用いて接続します。MySQLは、ADO.NET、ODBC、JDBC、C++など様々なクライアント・アダプタを提供しており、MySQLと接続互換のあるBIツールを利用することが可能です。

また、ANSIが定める標準SQLにも準拠しており、多くの開発者にとって、最も開発し易い言語で、開発生産性を向上させることができることも魅力の1つと言えます。

図11:InfiniDBのアーキテクチャとUM/PMの役割

図11:InfiniDBのアーキテクチャとUM/PMの役割

Indyコラム

Indy

ボクは基本的にコマン・ドベースで扱えるんだけど、GUIで扱いたい人向けにいくつかGUIツールを紹介するね。

ボク専用のGUIツールはないんだけど、データ・モデルやSQLの作成には、MySQL用に提供されている各種GUIツールが利用できるんだ。

例えば、図12のように、コミュニティ版として提供されている「MySQL Workbench」の他、「SQLyog」や「phpMyAdmin」なんかも使えるよ。

図12:GUIツール

図12:GUIツール


その他サポート機能


「InfiniDB」のその他サポート機能についてご紹介します。

・トランザクション・サポート(ACID)
ACID準拠のトランザクションをサポートします。トランザクションのコミット/ロールバックができ、デッドロックも検出します。

・DMLサポート
データの高速バルクロードのサポートに加えて、DML操作(追加/更新/削除)もすべてサポートします。列指向の特性上、「InfiniDB」をOLTP系のデータベースとして利用することは推奨しません。

・多版型同時実行制御(MVCC)サポート
スナップショット読み取り機能により、問い合わせ操作が表でブロックされることはなく(ロック影響なし)、問い合わせ発行時に存在していたデータの参照(読み取り一貫性)を保証します。

・ハッシュ・ジョイン・サポート
MySQLではテーブル結合にネスティッド・ループ・ジョインが使用されますが、「InfiniDB」は大量データの処理に効果を発揮するハッシュ・ジョインを採用しています。

Indyコラム

Indy

DWH処理には強いボクだけど、もちろん万能じゃないよ。ここだけの話、汎用DBMSが最も得意とする行ベースの処理は苦手なんだ。

特に、1行ずつ追加(INSERT)/更新(UPDATE)/削除(DELETE)するようなOLTPの更新処理は、ボクに限らず列指向DBMSは得意じゃないのさ。列指向は1行を列ごとに細切れにして格納しているから、行ベースの処理はどうしても遅くなるんだ。DWH専用ソフトウェアの中にはOLTP処理をサポートしないDBMSもあるけど、ボクなら、ディメンジョン表のちょっとしたデータのメンテナンスとかなら、がんばれるかな・・・。


最後に、3つの目の特長「Scalable」(拡張可能)についてご紹介します。

スケールアップ、スケールアウト


「InfiniDB」は、「その力 無限大」というキャッチにもあるとおり、性能向上にあたって非常に高い拡張性を備えています。図13のように、安価なPCサーバ1台からスタート可能であり、サーバ性能が限界を迎えたら、柔軟にスケール(スケールアップ/スケールアウト)することができます。スケール時の性能は、いずれもリニアに向上します。

また、「InfiniDB」は独立したソフトウェアであるため、ハードウェアの進化に合わせて、その時々の最適な組み合わせで、より高速でスケーラブルなDWHを構築することができます。

小さく始めて、データ増加や利用者増、用途拡大に合わせた拡張シナリオを組み易いというのは、具体的な投資対効果を提示するのが難しいDWHシステムにおいて、非常に有効な特長だと言えます。

図13:スケーラブル「その力 無限大」

図13:スケーラブル「その力 無限大」

今回は、DWH系処理に適した列指向DBMSの優位性について、「InfiniDB」の紹介をとおして解説しました。

次回は、「InfiniDB」の3つの特長を裏付ける製品ポテンシャルについて、スケールアップやスケールアウトの検証結果などを含めてご紹介します。


執筆者紹介

岸和田 隆

岸和田 隆(Takashi Kishiwada)

株式会社アシスト データベース技術本部

アシスト入社後、Oracle Database の研修講師、フィールド・ サポート、新バージョンの検証を経て、2007年 自社ブランド 「DODAI」の準アプライアンス製品の企画・開発、2009年 PostgreSQL、2011年 EDB Postgres、MySQL / MariaDB の事業立上を担当。 現在は「データベースのアシスト」を目指した活動を行っている。

岸和田の紹介記事はこちら



関 俊洋

関 俊洋(Toshihiro Seki)

株式会社アシスト データベース技術本部

2006年、株式会社アシスト入社。データベース・システムの構築や運用トラブルの解決といったフィールド・サポート業務を経験し、その後は新製品の検証やハードウェアとデータベースを組み合わせたソリューション(DODAI)の立ち上げに従事。現在はデータベースの価値や魅力を伝えるための執筆・講演活動を行っている。『SQL逆引き大全363の極意』共著。

関の紹介記事はこちら

連載記事一覧


Facebookで情報をお届けしています

Facebookでは、アシストの「今」を週3回のペースでお届けしています。「めげない、逃げない、あまり儲けない」を合言葉に日々頑張っておりますので、応援よろしくお願いします。



ページの先頭へ戻る