OLTPとOLAP|なぜRDBのまま分析しないのか

OLTPとOLAP|なぜRDBのまま分析しないのか

注文や会員の情報を記録しているデータベースがあるなら、売上の集計もそこへ SQL を投げれば済みそうに見えます。

それでも多くの構成では、分析のためにデータウェアハウスという別の置き場所を用意し、そこへデータを写してから集計しています。

理由は、データベースへの頼み方が、少ない行を読み書きする OLTP と大量の行を集計する OLAP に分かれていて、得意な作りが逆向きだからです。

この違いが分かると、分析用のサービスが別に用意されている理由と、RDB のまま分析してよい場面の見分け方に説明がつきます。

私は DynamoDB を個人開発で使っていますが、データウェアハウスは運用したことがなく、各社の公式ドキュメントをたどって整理しています。

OLTPとOLAPとは

OLTP は Online Transaction Processing の略です。

支払いの受け付けや在庫の移動、注文の登録のような業務のやり取りを、起きたその場で記録する処理を指します。

1 件のやり取りは全部成功するか全部取り消すかのどちらかで終わる必要があり、途中まで進んだ半端な状態を残してはいけません。

OLAP は Online Analytical Processing の略で、大量のデータに集計や傾向の分析をかけて、判断の材料を作る処理のことです。

Microsoft の OLAP の解説は、OLAP を業務のシステムを乱さずに複雑なクエリを回すための技術と説明しています。

Online Analytical Processing - Azure Architecture Center

AWS と Microsoft の解説を突き合わせると、両者の違いは次のようになります。

観点OLTPOLAP
目的業務のやり取りをその場で記録する大量のデータを集計して判断の材料にする
1 回に触る範囲少ない行の、ほぼすべての列とても多くの行の、一部の列
読み書き書き込みが多い読み取りが中心で、書き込みは少ない
応答時間の目安ミリ秒数秒〜数分
データ量の目安GB 規模TB〜PB 規模
データの形正規化した表スター・スキーマなど集計向けの形
AWS の代表例RDS・Aurora・DynamoDBRedshift・Athena

OLTP は少ない行を丸ごと読み書きし、OLAP は大量の行から一部の列だけを読むという差が、この先の話すべての土台になります。

AWS も OLTP と OLAP の比較の中で、Redshift を OLAP のために設計したクラウドのデータウェアハウスと紹介しています。

OLTP vs OLAP - Difference Between Data Processing Systems - AWS

データベースを「どんな問いに速く答えるか」で分ける見方は、意味の近さで行を引くベクトルデータベースにも当てはまります。

ベクトルデータベースとは?意味の近さで引く仕組みを整理

なぜRDBのまま分析しないのか

業務用の RDB で重い集計を回さない理由は、公式ドキュメントを読むと 3 つに分けられます。

行ごとの保存は集計に向かない

一般的な RDB は、1 行分の値をひとまとまりにして、ディスクのブロックへ並べています。

Amazon Redshift の開発者ガイドにある列指向ストレージの説明によると、この行ごとの保存は OLTP に最適です。

Columnar storage - Amazon Redshift

OLTP では、1 件か少数のレコードについて、全部の列を読み書きすることが多いからです。

一方で集計は、売上金額の列だけを何百万行ぶん足し合わせるような読み方です。

行ごとに保存されていると、使わない列までブロックごと読み込むことになります。

列指向のストレージは列ごとに値を並べて保存するので、集計に必要な列のブロックだけを読めば済みます。

同じガイドの例では、100 列の表で 5 列だけを使うクエリは、表のデータの約 5% を読むだけで済むとされています。

同じ型の値が並ぶので、列の型に合わせた圧縮が効きやすいのも利点です。

集計が業務の処理を止める

Microsoft の OLTP の解説は、何百万件ものトランザクションをまたぐ集計は、OLTP のシステムにとって資源を大きく食う処理だと書いています。

Online Transaction Processing (OLTP) - Azure Architecture Center

遅いだけでなく、ほかのトランザクションをブロックして、データベース全体を遅くすることがあるという指摘です。

注文を受け付ける処理と月次の集計が同じデータベースを取り合うと、集計のせいで注文の処理まで詰まることになりかねません。

正規化された表は分析のSQLを難しくする

OLTP の表は、同じ値を何度も持たないように細かく分けて正規化されています。

これは 1 件ずつの書き込みを、整合性を保ったまま速く処理するための工夫です。

ところが分析のときは、ほとんどのクエリが表の結合(JOIN)を重ねて、分けた表を元の形に戻すところから始まります。

同じ解説は、その結果、データベース管理者や開発者の助けがないと、業務の担当者がクエリを書きにくくなると指摘しています。

取引の履歴を無期限にため込むことも、クエリが遅くなる原因になります。

よくある対処として挙げられているのは、業務のデータベースには今期のような直近の期間だけを残し、古い履歴をデータウェアハウスなどへ移す方法です。

なお、Redshift も SQL で問い合わせるリレーショナルデータベースの一種です。

分けているのは RDB かどうかではなく、行と列のどちらで保存し、どんな頼まれ方に合わせて作られているか、という違いにあります。

どこで使われるか

典型的な構成は、アプリが OLTP のデータベースに書き込み、そのデータを分析側へ写してから集計する、という 2 段の形です。

Microsoft の OLAP の解説にある図も、アプリから OLTP、OLTP から OLAP、そこから分析とレポートへ、という流れで描かれています。

AWS でいえば、OLTP 側に来るのは RDS・Aurora・DynamoDB です。

OLAP 側には、Redshift や、S3 に置いたデータへ直接 SQL を投げられる Athena が来ます。

業務の DB から分析側へ写す方法は、代表的なものが 3 つあります。

  • Aurora から Redshift へ: zero-ETL 統合で、Aurora に書き込まれたデータをほぼリアルタイムで Redshift に複製する
  • DynamoDB から S3 へ: テーブルを S3 へエクスポートし、Athena などで分析する
  • RDS からリードレプリカへ: 読み取り専用のコピーを作り、レポートのクエリをそちらへ向ける

Aurora の zero-ETL 統合について、AWS はETL のパイプラインを自分で組んで保守する必要がなくなることを利点に挙げています。

Aurora zero-ETL integrations - Amazon Aurora

DynamoDB の S3 エクスポートは、読み込みキャパシティを消費せず、テーブルの性能や可用性にも影響しないと公式ドキュメントに書かれています。

DynamoDB data export to Amazon S3: how it works - Amazon DynamoDB

業務のシステムからデータを取り出す作業がなぜ失敗しやすく、どう備えるかは、Palantir の資料をもとに FDE のデータ統合を扱った記事で整理しました。

FDEが扱うデータ統合の現実|顧客システムからどう取り出すか

先に知っておく用語

この先の選び分けで出てくる言葉を、短く確かめておきます。

  • ETL: Extract(取り出し)・Transform(変換)・Load(読み込み)の頭文字で、複数の元データをまとめて中央のデータウェアハウスに入れる処理
  • zero-ETL 統合: その ETL のパイプラインを AWS が用意して管理し、業務の DB から分析側へ自動で複製する仕組み
  • データウェアハウス: 複数のシステムから集めたデータを共通の形にそろえ、長い期間保存して分析に使う置き場所
  • リードレプリカ: 元の DB の読み取り専用のコピーで、元の DB の更新が非同期で反映される
  • スター・スキーマ: 売上のような出来事を記録する中心の表を、商品・店舗・日付といった切り口の表が囲む、集計向けの表の組み方
  • HTAP: Hybrid Transactional and Analytical Processing の略で、1 つの基盤で OLTP と OLAP の両方をこなそうとする考え方

いつRDBのまま分析してよいか

ここまで読むと何でも分けたくなりますが、Microsoft の OLTP の解説も、よく計画されたスキーマのような例外はあると書いています。

分けるかどうかは、データの量、集計の重さ、どれだけ新しいデータが要るか、の 3 つで決まります。

私が個人開発している草野球リーグの管理アプリは DynamoDB を使い、打率などの成績はスコアを保存するたびに計算し直して、選手のデータへ書き戻しています。

ランキングはその選手データを読んで並べ替えているだけで、分析用の置き場所は用意していません。

データが小さく、知りたい集計が決まっているなら、このように書き込みのときに集計を済ませておく方法で、OLTP 側に収まります。

状況ごとの選び方を表にすると、次のようになります。

状況選ぶもの理由
データが小さく、集計の種類が決まっている業務の DB のまま写す仕組みを増やすと、その保守も増える
レポートの SQL が本番の DB を圧迫しているRDS のリードレプリカ集計を読み取り専用のコピーへ向けられる
Aurora のデータをほぼリアルタイムで分析したいzero-ETL 統合で Redshift へ写すパイプラインを自分で組まなくてよい
S3 に置いたログなどを、ときどき SQL で調べたいAthenaサーバーを用意せず、S3 のデータへ直接クエリを投げられる
複数のシステムのデータを集め、長く保存して大きな表を結合するRedshift大きな表を多数結合する複雑なクエリに向けて最適化されている
DynamoDB のデータを集計したいS3 へエクスポートして Athena などScan で全件を読むと本番の読み込みキャパシティを使う

RDS のリードレプリカの説明にも、本番の DB インスタンスの代わりにレプリカでレポートのクエリを動かす使い方が挙がっています。

Working with DB instance read replicas - Amazon Relational Database Service

ただし元の DB の更新は非同期で写るので、レプリカでは少し遅れたデータを読むことになります。

また、レプリカは元と同じエンジンのコピーなので、本番への影響は切り離せても、列指向の読み方に変わるわけではありません。

AWS の Athena の使いどころの説明は、S3 上のデータへのアドホックなクエリには Athena を勧めています。

When should I use Athena? - Amazon Athena

多数の大きな表を何度も結合する複雑なクエリには、Redshift が向くという整理です。

負荷を逃がすだけならリードレプリカ、読み方ごと変えたいなら Redshift や Athena、と分けて考えると選びやすくなります。

課金と落とし穴

分析側のサービスは、何に対して課金されるかがそれぞれ違うので、構成を決める前に軸だけでも知っておくと安心です。

課金の軸

金額は改定されやすいので、ここでは何に対して払うかだけを挙げます。

  • RDS のリードレプリカ: 通常の DB インスタンスと同じ扱いで課金される。同じリージョン内での複製の転送には料金がかからない
  • Redshift Serverless: 計算は使った処理能力(RPU)に対して秒単位で課金され、最低は 60 秒ぶん。ストレージは GB 月で別に課金される。無料トライアルがある
  • Athena: SQL クエリはスキャンしたデータ量で課金される。テーブルやパーティションを管理する DDL と失敗したクエリは課金されず、途中で取り消したクエリはそれまでにスキャンした分が課金される
  • DynamoDB の S3 エクスポート: 全体のエクスポートはテーブルの大きさ、増分のエクスポートは処理したデータ量で課金される。書き出した先の S3 の保存とリクエストは別に課金される。使うにはテーブルのポイントインタイムリカバリ(PITR)を有効にしておく必要がある

Scanで集計すると本番の読み込み枠を食う

DynamoDB の Query と Scan のベストプラクティスによると、Scan は表全体を読んでから、条件に合わない項目を捨てる操作です。

Best practices for querying and scanning data in DynamoDB - Amazon DynamoDB

大きな表への Scan は、1 回の操作でプロビジョンドスループットを使い切ることがあります。

そうなると同じ表へのほかのリクエストがスロットリングされる、と注意されています。

分析が目的なら、読み込みキャパシティを消費しない S3 へのエクスポートに切り替えたほうが、本番への影響を避けられます。

列指向でも全部の列を読めば高くつく

Athena の料金ページは、データを Parquet のような列指向の形式に変える例を示しています。

Amazon Athena Pricing

クエリが参照する列だけを読めるので、スキャンするデータ量が減るという説明です。

逆に、CSV のような行ごとの形式のまま置いたり、SELECT * ですべての列を取り出したりすると、必要のない列まで読むことになります。

開いたままの接続も課金される

Redshift Serverless の課金の説明によると、終わらせていないトランザクションがあると、その間も処理能力が使われ続けます。

Billing for Amazon Redshift Serverless - Amazon Redshift

接続プールが死活確認のために定期的に送る SELECT 1 のような軽いクエリも、課金される利用として扱われます。

予期しない請求を防ぐために、最大 RPU 時間の上限を設定しておくことが勧められています。

写した先の権限は別に設計する

責任共有モデルでいう自分側の仕事として、分析側に写したデータを誰が読めるかの設計も残ります。

Microsoft の OLAP の解説は、利用者を業務の DB に直接つなぐ方法には、権限の管理が難しくなる欠点があると書いていました。

同じ指標でも、人によって違う数字が出やすいとも指摘しています。

代わりに勧められているのは、データウェアハウスの上に分析用のモデルを置き、行単位のセキュリティもそこでかける形です。

他クラウドでは

Google Cloud では、Cloud SQL や Spanner が OLTP 側、BigQuery が OLAP 側にあたります。

BigQuery の概要によると、BigQuery はフルマネージドでサーバーレスのデータウェアハウスで、分析向けに最適化した列指向のストレージを使います。

BigQuery overview  |  Google Cloud Documentation

計算と保存の層が分かれていて、それぞれが相手の性能に影響せずに資源を割り当てられる作りです。

課金はオンデマンドと、処理能力を予約する容量ベースの 2 通りから選べます。

Azure では、Azure SQL Database や Azure Database for PostgreSQL・MySQL、Azure Cosmos DB が OLTP 側です。

OLAP 側の中心は Microsoft Fabric になります。

Microsoft の OLAP の解説は、SQL Server や Azure SQL Database の列ストアインデックスにも触れています。

これを使うと、1 つの基盤で OLTP と OLAP をこなす HTAP の形もとれる、という説明でした。

ここまでに出てきたサービスを 3 社で並べると、次のとおりです。

区分AWSGoogle CloudAzure
OLTP(業務の読み書き)RDS・Aurora・DynamoDBCloud SQL・SpannerAzure SQL Database・Azure Cosmos DB
OLAP(分析)Redshift・AthenaBigQueryMicrosoft Fabric

参考

本文のリンクで紹介した公式ドキュメントは、いずれも 2026-10-02 に参照しました。

料金や仕様は改定されることがあるので、構成を決める前にはリンク先の最新の記述を確かめてください。

最後に

業務のデータベースは少ない行を速く確実に読み書きするための作りで、大量の行の一部の列を集計する分析とは、得意なことが逆向きです。

分析を切り出すかどうかは、データの量と集計の重さ、どれだけ新しいデータが要るかで決まり、小さいうちは業務の DB のままでも困りません。

資格試験では、AWS の SAA-C03 の試験ガイドのタスク 3.3 が、読み込み中心か書き込み中心かというアクセスパターンとリードレプリカを挙げています。

Content Domain 3: Design High-Performing Architectures - AWS Certified Solutions Architect - Associate

同じガイドのタスク 3.5 には、Athena と、CSV から Parquet への形式の変換が含まれています。

Azure の DP-900 の学習ガイドでも、トランザクションのワークロードと分析のワークロードの特徴が出題範囲の一つです。

Study guide for Exam DP-900: Microsoft Azure Data Fundamentals

集計を書く前に、どの行のどの列をどれだけ読むのかを数えてみると、置き場所の答えはおのずと絞られてきます。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA