カラム指向データベースとは
カラム指向データベースは、その名前が示す通り、データを行ではなく列ごとに格納します。Oracle、PostgreSQL、MySQLなどの従来のリレーショナルデータベースとは異なり、これらのデータベースはデータを列ごとに扱うことに焦点を当てています。
カラム指向データベースにおけるデータの扱い
行指向データベースは、データを行ごとに格納し、操作します。このデータの格納方法では、各行をレコードとして扱い、行内の全てのデータを1つの単位として処理します。
次の書店の販売データを考えてみます。
日付 | 店舗 | 従業員 | 書籍のカテゴリー | 販売数量 | 総売上高 |
---|---|---|---|---|---|
2023/6/1 | NYC | John | Fiction | 10 | $200 |
2023/6/1 | NYC | Sarah | Non-fiction | 5 | $150 |
2023/6/1 | NYC | Paul | Fiction | 8 | $80 |
2023/6/2 | NYC | John | Fiction | 7 | $140 |
2023/6/2 | NYC | John | Non-fiction | 4 | $80 |
行指向データベースでは、各販売は1つの行として扱われ、関連するデータ要素(日付
、店舗
、従業員
、書籍のカテゴリー
、販売数量
、総売上高
)がまとめてグループ化されます。
一方、カラム指向データベースでは、データを列ごとに処理します。各データ要素(例えば、日付
や総売上高
)について、データベースはその要素の全てのインスタンスを1つの列に格納します。
同じ書店の販売データを考えると、カラム指向データベースにおけるデータの扱いは次のようになります。
日付 | 店舗 | 従業員 | 書籍のカテゴリー | 販売数量 | 総売上高 |
---|---|---|---|---|---|
2023/6/1 * 3 | NYC * 5 | John * 3 | Fiction * 3 | 10 * 1 | $200 * 1 |
2023/6/2 * 2 | Sarah * 1 | Non-fiction * 2 | 5 * 1 | $150 * 1 | |
Paul * 1 | 8 * 1 | $80 * 1 | |||
7 * 1 | $140 * 1 | ||||
4 * 1 | $80 * 1 |
例えば、NYCの店舗の総売上高を求めるとき、行指向データベースでは全データを行ごとに読み取り、各行の店舗フィールドをチェックし、NYCの店舗エントリの総売上高
フィールドを合計する必要があります。このプロセスでは、店舗
と総売上高
のデータ以外も含めてデータを不要に読み取る可能性があります。
対照的に、カラム指向データベースでは、店舗列
と総売上高列
のみを読み取ります。これにより、ディスクから読み取るデータ量が減り、操作の処理速度が向上します。
カラム指向データベースのデメリット
カラム指向データベースには、データ分析タスクに特に優れている多くの利点がありますが、欠点もあります。そのうちの一つが、オンライントランザクションの管理に特化した最適化の欠如です。
カラム指向データベースは、新しいデータの追加、更新、削除などの処理において、かなりのオーバーヘッドと非効率性を抱えています。そのため、トランザクション処理には適していません。
テーブルに新しい行データを追加したいとします。行指向データベースでは、これは簡単なタスクです。新しい行をテーブルに追加するだけです。しかし、カラム指向データベースでは、プロセスがより複雑になります。圧縮されたデータをまず展開する必要があります。その後、各列の値を読み込んで適切な場所に追加する必要があります。最後に、列を再度圧縮する必要があります。このプロセスには計算のオーバーヘッドと複雑さが加わり、データベースに頻繁に小規模な変更が必要な場合(トランザクション処理のシナリオなど)には非効率です。
参考