事前集計を行うタイミング
データの鮮度とコストを基準に、リアルタイム集計、マテリアライズドビュー、下流の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フィードバックを取得できます。ローカル設定は不要です。