フューチャー技術ブログ

IT初学者がカラムナデータベースを勉強してみた

はじめに

こんにちは。2020年4月に入社した牛尾です。春の入門連載2021の4日目です。

私はITについては初学者の状態で入社しました。フューチャーの同期社員や、OJTでご指導くださった先輩社員の技術への知見の深さや広さ、また社会人としての諸々の能力の高さにただただ尊敬する毎日です。

IT初学者の私が入社してから1年間学んできたIT分野のなかで、特に楽しかった技術を抜粋してご紹介します。

私のようにIT初学者で、エンジニア、ITコンサルタントを志望している皆さんの楽しい社会人生活のキャリアを描く一助となれたら嬉しく思います!

紹介するトピック

本記事では カラムナデータベース を紹介いたします。

私は入社してから初めてデータベースを学び、研修当初は一般的な リレーショナルデータベース を学んできましたが、今は カラムナデータベース やKVSデータベースなど勉強しています。

IT初学者の自分が学んで楽しかった内容の紹介です。もし、技術への知見の深い方はこちらの記事などを参照してもらえればです。

データベースとは

定義づけを確認すると、Oracleのサイトでは以下のように書かれています。

「データベースとは、構造化した情報またはデータの組織的な集合」
https://www.oracle.com/jp/database/what-is-database/

前述したとおり自分が入社して初めて学んだのはリレーショナルデータベースでした。ここでは細かい部分のリレーショナルデータベースの説明を省略させていただきます。SQLやデータ設計については、当ブログでも参考になる記事がありますので参考ください。

カラムナデータベース

通常のOracle、Postgre、MySQLなどのリレーショナルデータベースでは、データを 行(レコード)単位で扱っているのに対して、カラムナデータベースではデータを列(カラム)方向で扱います。

例えば、とあるアパレル店での日付ごとに営業担当者の販売実績などを管理していたとして、列方向と行方向でのデータの扱い方は以下のようになります。

行と列データ
  • 行方向 : 日付、支店、営業担当者等をセットとして、 1行でデータを扱う
  • 列方向 : 日付データ、支店データなどの項目ごとに、 1列でデータを扱う

カラムナデータベースのメリット①

カラムナデータベースの1つ目のメリットは データの圧縮効率がよくなる ことです。

データの圧縮効率がよくなるというのはデータを列方向に保持しているとデータの定義情報や、値が同一のデータを格納しているので圧縮効率をあげやすいためです。

先ほどのアパレル店での表データの例を見ていきましょう。

a) 行方向(リレーショナルデータベース)

データは全て一意になるように格納されています。(一意にデータを格納することでデータ整合性を保証できるなどは大きなメリットです。)

日付、支店、担当者などをキーとして1行のデータが 完全一致していない別々のデータなので、カラムナデータベースと比較したときに、データの圧縮はしづらいという特徴があるのです 。

リレーショナルデータベースの場合でもストレージコストの削減やディスクI/Oを減らすことによるパフォーマンスの向上を目的としてデータの圧縮を実施する場合は多々あります。OracleではOLTP表圧縮などの圧縮機能が用意されているので、興味のある方はこちらを参照してみてください。

行方向データ

b) 列方向(カラムナデータベース)

列データの値を見てみると、「支店」は全て大阪の値「商品カテゴリ」は紳士服と婦人服であったりと重複 が見られます。

データを圧縮するときに「大阪5」などで表せば 効率的にデータを圧縮 できる気が直感的にするのではないでしょうか。(実際の圧縮はそのように単純にはおこなっていませんが、今回は分かりやすくするために、そのような表現をしました)

カラム方向データ

カラムナデータベースのメリット②

2つ目のメリットは 大量のデータに対してのアドホックな分析処理が高速になる (OLAP実装を得意とする)ことです。

先ほどの表データを例に行方向と列方向のデータベースの場合を見ていきましょう。

例えば、支店が「大阪」の販売金額の合計を集計したいとします。

1
SELECT SUM(販売金額) FROMWHERE 支店 = '大阪';

a) 行方向(リレーショナルデータベース)

行方向のデータベースでは行全体にアクセスをして、「支店」項目が大阪かを判別した後に「販売金額」の列データを抜き出してきます。先頭の行から順にアクセスをしているので、その分 「日付」や「営業担当者」等の必要のない項目にもアクセス をしています。

行方向アクセス

b) 列方向(カラムナデータベース)

列方向では、 必要のある「支店」「販売金額」の項目のみにアクセスをする ことで、必要最小限のディスクI/Oが実現できます。

データベースの処理速度が遅くなる原因は ディスクI/O が増加することなので(ディスクの処理速度が遅いため)不要なアクセスを避けることで 処理が高速 になります。

![列方向アクセス(/images/20210419b/列方向アクセス.jpg)

カラムナデータベースのデメリット

今までカラムナデータベースのメリットをみてきましたが、OLTPの実装には向かない という特徴が存在します。
データの圧縮、展開で オーバーヘッドが発生 するので、データの新規追加、更新、削除などのトランザクション処理は苦手 です。

例えば、先ほどの表データに1行データを追加したいとします。行方向のデータベースでは、行データをまとめて追加すればよいですが、列方向の場合は、圧縮したデータを一度展開して、各列項目を読み込んで追加したうえで、再度圧縮してあげるという処理が発生します。

データの展開圧縮

最後に

ここでは紹介しきれませんでしたが、データベースにはまだまだKVS型やXML型、JSON型、NoSQLなど色々な種類があります。データベース以外にも機会学習でCNNを簡易ながらも作ってみたり、暗号技術を勉強したりする日々はとても楽しいです。

これからも多くの技術書を業務内外で読みふけり、全力でITを楽しもうと思います。

参考

以下他サイトでの参照記事です。興味のある方は参照してみてください。