データベースの話で出てくる「行ベース(行指向)」と「列ベース(列指向)」。
言葉は知っていても、
はっきり説明できるかと言われると迷うことはないでしょうか。
- 何がどう違うのか
- なぜ「分析は列ベースが速い」と言われるのか
- どう使い分ければよいのか
この記事では、
データを物理的にどのような順序で保存しているか という観点から、
行ベースと列ベースの違いと使い分けを整理します。
1. そもそも何が違うのか?(物理的な並び順)
データベースを「エクセルの表」だと想像してください。
コンピュータのメモリやディスクは、「1列に並んだ長いテープ」 のような構造をしています。データベースはこのテープの上に、テーブルのデータを 順番に詰めて保存 しています。
このテープに、データをどの順序で詰めるか(行ごとか、列ごとか) によって、得意な処理が変わってきます。
行ベース(Row-Oriented)
1行分のデータをひとかたまりとして保存します。
[ID1, 名前1, 年齢1], [ID2, 名前2, 年齢2], [ID3, 名前3, 年齢3] ...
👉 「1人分の情報」が常にセットで並ぶ。
列ベース(Column-Oriented / Columnar)
同じ属性(カラム)のデータをひとかたまりとして保存します。
[ID1, ID2, ID3...], [名前1, 名前2, 名前3...], [年齢1, 年齢2, 年齢3...]
👉 「年齢だけ」「名前だけ」が横一列に並ぶ。
2. 行ベース vs 列ベース 比較表
| 観点 | 行ベース(行指向) | 列ベース(列指向) |
|---|---|---|
| 例えるなら | 「1人分のカルテ」をすぐ出せる受付 | 「全員分の年齢」を一瞬で集計する統計家 |
| データの保存単位 | 行(1件のレコードをまとめて保存) | 列(同じ項目のデータをまとめて保存) |
| 得意な処理 | データの追加・更新・削除 | 大量データの集計・分析 |
| 読み取り性能 |
SELECT * のような1件まるごと取得が速い |
SUM / AVG など特定カラムの集計が非常に速い |
| 書き込み性能 | 1行ずつの追加・更新が得意 | 1行追加は苦手 (まとめて書くのは得意) |
| 圧縮効率 | 低め(異なる種類のデータが混ざる) | 非常に高い(似たデータが並ぶ) |
| 主な用途 | OLTP(業務システム) | OLAP(分析・レポート) |
| 代表的な用途例 | ユーザー管理、注文管理、Webアプリ | 売上集計、ログ分析、BI |
OLTP / OLAP とは?
■ OLTP(Online Transaction Processing)
→ 日々の業務処理向け
→ データの 追加・更新・削除 を高速・正確に行う
例:注文登録、ユーザー情報更新
■ OLAP(Online Analytical Processing)
→ 分析・集計向け
→ 大量データをまとめて 集計・分析 する
例:売上集計、ログ分析、レポート作成
OCIの自律型データベース(Autonomous AI Database)では、用途に合わせてワークロード・タイプを選択できます。
■ Autonomous AI Transaction Processing (ATP)
向き:行ベース(行指向)
特徴: 「1件も落とせない」「1秒間に何千件も書き込む」といった、ミッションクリティカルなトランザクション処理(OLTP)に最適化されています。
■ Autonomous AI Lakehouse (ALH)
向き:列ベース(列指向)
特徴: DB内のデータだけでなく、外部のオブジェクト・ストレージにある巨大なファイル(Apache Iceberg等)も列指向で高速スキャンします。複数の環境に散らばったデータをコピーせず、そのまま集計・分析するのに長けています。
※上記に加え、現時点ではJSONデータベース、APEXサービスをサポートしています。
3. なぜ列ベースは「集計」が速いのか?
例えば、「100万人のユーザーの中から平均年齢を出したい」 というクエリを投げたとします。
行ベースの場合: 「1人目のデータ全部(住所も趣味も)を読み、年齢だけ取り出す」→「2人目のデータ全部を読み…」という作業を100万回繰り返します。いらない情報(住所や趣味)までディスクから読み込むため、I/Oがムダになります。
列ベースの場合: 「年齢」のデータが固まっている場所をガバッと一気に読み込むだけです。他のカラム(名前や住所)には一切触れません。
👉 つまり、列ベースの場合、必要なカラムだけをピンポイントで読めるため、ディスクやメモリから読む量そのものが圧倒的に少なくなり、結果として集計処理が非常に高速になります。
4. 列ベースが速いもう一つの理由「高い圧縮効率」
列ベースが分析に強いもう一つの理由は、データの圧縮効率です。
例えば「国籍」というカラム。 行ベースだと、行ごとに「日本」「日本」「米国」...とバラバラに保存されますが、列ベースなら「日本」が10,000個続くような並びになります。 このように 同じ値が連続する ため、ZIP などの圧縮アルゴリズムと非常に相性が良くなります。
- データサイズが小さくなる
- ディスク I/O が減る
- 結果として処理がさらに速くなる
という好循環が生まれます。
5. どう使い分けるのか
では、これらを踏まえてどう使い分ければよいのでしょうか。
迷わず「行ベース」を選ぶとき
- ユーザーの新規登録や、プロフィールの更新が多い。
- IDを指定して「その人の情報すべて」を引っ張ってくる処理がメイン。
- 一般的なWebアプリケーションのバックエンド(OLTP)。
迷わず「列ベース」を選ぶとき
- 数千万〜数億件のログを分析したい。
-「先月の売上合計は?」「特定の商品の購入率は?」といった集計がメイン。 - BIツール(TableauやLookerなど)のデータソースにする。
行ベースと列ベースは、どちらが優れているかではなく、「どんな処理をしたいか」によって選ぶものです。
ここまでの特性を踏まえて使い分けられれば、データベース設計でも、用途に合った選択ができるようになります。
