Page tree
Skip to end of metadata
Go to start of metadata

同じ SQL を通じて手続きを実行するデータベースは,大きく二種類にわけられます。一つは MySQL や PostgreSQL,SQL Server が採用してきた「行指向」データベースです。これらのデータベースは主にフロントエンドのサービスやシステムと密接に結びついており,頻繁にレコードにアクセスして内容を更新していきます。また検索エンジンとして,適切に作られたインデックスを使用して高速な検索を実現します。

一方,近年登場した「列指向」データベースは,主にデータ分析のために最適化されたデータベースで,大規模なデータに対する集計処理を高速に行います。近年のデータウェアハウスはこの形のデータベースが増えてきました。列指向データベースでもデータ設計(モデリング)が重要になってきます。特に分散ストレージの扱いは非常に難易度の高い部分ではありますが,テクノロジーの発達によって,難しい部分はクラウドサービスに吸収させておいて,主にデータの取得・集約を行う本業である「データ分析」だけにユーザーが専念できる環境が整ってきました。

(左)行指向データベースは,行単位でデータを保持,また取り出しを行います。
(右)列指向データベースは列単位でデータを取得,取り出しを行います。

また,レコードへのアクセス方法も異なります。 行指向データベースでは常に各行の全ての列を読み込むのに対し,列指向データベースでは指定した列しか読み込みません。

行指向データベースの特徴

  1. 少数の行に対する多くの列の取得が効率的。1行全体の書き出しを,1度のディスクシークで読み取ることができる。

  2. 少数の行に対する多くの列の更新が効率的。1行全体の書き出しを,1度のディスクシークで行うことができる。

↑ 行指向データベースでは常に行単位でレコードを読んでいきます。さらに適切なインデックスが作成されていれば,条件をみたすレコード以外は読み飛ばすことが可能です。一方,アクセスした各レコードについては常に全てのカラムを読み取ることになります。

1行追加処理

新しくデータを1行追加するとします。この処理は行ごとに全てのカラムを取得する行指向データベースに向いていて,1回の処理でこれを達成します。

1行更新処理

特定のレコードを取り出して内容を更新する処理も,行指向の方が優位です。特に適切にインデックスが張られている場合には,該当するレコードをすぐに見つけ出すことができます。そして1回の処理で該当レコードのカラムを更新します。

ある列に対する集計処理

一方,ある少数の列に対して集計処理を行う時には行指向は非効率です。データベースから1行目を取り出して集計対象のカラムを抜き出して足し算,2行目を取り出して集計対象のカラムを抜き出して足し算という処理を繰り返します。

列指向データベースの特徴

  1. 大量の行に対する少数の列の集約処理が効率的。列数が少ないほど,読み込むデータ量を減らすことができる。

  2. 全行に対する少数の列の一括更新が効率的。新規に列データを作成し,以前のデータと置換することで他の列へのアクセスを回避できる。

↑ 列指向データベースでは常に列単位でレコードを読んでいきます。基本的に行方向については全件スキャンとなることを念頭に入れておくならば,クエリで指定したカラム以外は無視するという列指向はなかなか優秀です。

1行追加処理

新しくデータを1行追加するとします。たった1行追加するだけでも,列指向データベースではそのテーブルが持っている全ての列に対して,別々に値を追加していかないといけないので,1回の処理では終わらせることができません。

1行更新処理

更新も同じです。特に多くの列に対して更新が行われる場合は,1行の更新に対して更新するカラム数だけの処理が必要になります。

ある列に対する集計処理

一方,一般に集計処理と言われるものは列に対する集計処理となるので列指向データベースが最も得意とするところです。仮に全レコードの,たった一つのカラムの集計を行う場合は,列指向データベースでは1個の列の縦スキャンで集計処理を済ませられます。 

  • No labels