0Pricing
SQL Academy · レッスン

事前集計を行うタイミング

データの鮮度とコストを基準に、リアルタイム集計、マテリアライズドビュー、下流のOLAPを使い分けます。

「事前集計を行うタイミング」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

集計クエリの 3 つの戦略

  • 都度実行 — 毎回再計算する
  • マテリアライズド — 保存して定期的にリフレッシュする
  • トリガー方式/キャッシュ方式 — 変更のたびに増分更新する

都度集計

シンプルで、常に最新です。

SELECT user_id, COUNT(*) FROM orders WHERE status = 'paid' GROUP BY user_id;

都度実行で十分な場合

クエリが十分に高速な場合です(適切なインデックス、小さな結果セット、呼び出し頻度が低いなど)。まずは都度実行を選び、問題を測定してから最適化してください。

マテリアライズド集計

コストが高く、「十分に新しい」レポートに適しています。

CREATE MATERIALIZED VIEW user_revenue_30d AS
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY user_id;

-- Refresh nightly:
REFRESH MATERIALIZED VIEW CONCURRENTLY user_revenue_30d;

トリガー方式/増分集計

リアルタイムダッシュボードには、トリガーで集計テーブルを維持します。

CREATE TABLE user_summary (
  user_id BIGINT PRIMARY KEY,
  order_count INT NOT NULL DEFAULT 0,
  revenue NUMERIC(12,2) NOT NULL DEFAULT 0
);

CREATE FUNCTION incr_summary() RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO user_summary (user_id, order_count, revenue)
  VALUES (NEW.user_id, 1, NEW.total)
  ON CONFLICT (user_id) DO UPDATE
  SET order_count = user_summary.order_count + 1,
      revenue     = user_summary.revenue + EXCLUDED.revenue;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_summary AFTER INSERT ON orders
FOR EACH ROW EXECUTE FUNCTION incr_summary();

トレードオフ

戦略鮮度書き込みコスト読み取りコスト
都度実行即時なし高
マテリアライズド古くなるバッチリフレッシュ低
トリガー方式即時書き込みごと低

読み取り/書き込み比率で選ぶ

  • 書き込みが多く、読み取りがたまにある → 都度実行(またはバッチ式のマテリアライズドビュー)
  • 読み取りが多く、書き込みが中程度 → マテリアライズドビュー
  • 読み取りと書き込みが多く、鮮度が重要 → トリガー方式の集計

外部での事前集計

データウェアハウス規模の分析では、集計を次の環境に移します。

  • OLAP データベース(ClickHouse、Druid)
  • 別のデータウェアハウス上の dbt モデル
  • TimescaleDB の連続集計(Postgres 拡張)

集計テーブルとマテリアライズドビューの比較

カスタム集計テーブルでは増分更新が可能ですが、マテリアライズドビューでは全体のリフレッシュが必要です。開発工数と運用の単純さを比較して選択してください。

負荷の高いテーブルでのトリガーを避ける

トリガー方式の集計では、すべての操作に書き込み遅延が追加されます。高頻度テーブル(イベント、メトリクス)では、バッチ式のマテリアライズドビューのリフレッシュを優先してください。

キャッシュの無効化に注意

「CS で難しいことは 2 つしかありません。」トリガー方式の集計はキャッシュです。ここでのバグは、ダッシュボードの誤った数値として現れます。ソースから再計算する日次の突合ジョブを追加してください。

複数段階のパイプラインをマテリアライズする

マテリアライズドビューを連鎖させます。ステージ 1 でイベントを集計し、ステージ 2 でステージ 1 を集計します。順番どおりにリフレッシュしてください。

まとめ

読み取りコストが支配的な場合は、事前集計してください。

  • 都度実行 → 最もシンプルで、常に最新
  • マテリアライズドビュー → コストの高いクエリで、多少古くてもよい場合
  • トリガー方式の集計 → 常に最新だが、書き込みコストがかかる
  • 読み取りと書き込みの特性に応じて選択

クイックチェック

ユーザーの収益を秒単位でリアルタイムに表示する必要があるダッシュボードがあります。どの戦略が最適でしょうか。

よくある質問

「事前集計を行うタイミング」レッスンは無料ですか?

はい。「事前集計を行うタイミング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「事前集計を行うタイミング」で何を学びますか?

データの鮮度とコストを基準に、リアルタイム集計、マテリアライズドビュー、下流のOLAPを使い分けます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「事前集計を行うタイミング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 通常のビュー:論理的な再利用
  2. 更新可能ビューとINSTEAD OFトリガー
  3. マテリアライズドビューとREFRESH戦略
  4. 事前集計を行うタイミング
← SQL Academyに戻る