BIダッシュボードや大量集計処理で「クエリが重い」「反応が遅い」と感じたら、マテリアライズドビューとサマリーテーブルの出番です。本章では、定期集計の自動化設計、リフレッシュ戦略、DWHでの最適なサマリーテーブル設計を、実例を交えて解説します。
定期集計の設計:マテリアライズドビューとは?
マテリアライズドビュー(Materialized View)は、SELECTの結果を物理的なテーブルとして保存するビューです。複雑なJOINや集計を事前に実行しておくことで、クエリの高速化を実現します。
PostgreSQLでの基本構文
CREATE MATERIALIZED VIEW monthly_sales_summary AS SELECT product_id, DATE_TRUNC('month', sale_date) AS month, SUM(amount) AS total_amount FROM sales GROUP BY product_id, DATE_TRUNC('month', sale_date);
定期集計には DATE_TRUNC や GROUP BY を組み合わせて、月次・週次・日次など用途別に設計します。
MySQLの場合
MySQLにはマテリアライズドビューのネイティブ機能がありませんが、サマリーテーブルを手動またはスクリプトで更新することで同様の効果が得られます。
CREATE TABLE monthly_sales_summary AS SELECT product_id, DATE_FORMAT(sale_date, '%Y-%m') AS month, SUM(amount) AS total_amount FROM sales GROUP BY product_id, month;
自動リフレッシュ戦略
マテリアライズドビューは静的なデータのため、リフレッシュ処理をスケジュール化する必要があります。
1. PostgreSQL:REFRESH MATERIALIZED VIEW
REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales_summary;
CONCURRENTLYを付けると同時アクセス中でもロックを避けて更新可能(ただしインデックス必須)- 定期実行には
cronやpg_cron拡張が便利
2. Shellスクリプト + cron での自動化
#!/bin/bash psql -U myuser -d mydb -c "REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales_summary"
# crontab - 毎日3時に実行 0 3 * * * /home/scripts/refresh_mv.sh >> /var/log/mv_refresh.log 2>&1
3. Airflowでのスケジューリング例
refresh_mv = PostgresOperator( task_id="refresh_mv", postgres_conn_id="my_postgres", sql="REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales_summary;" )
注意点: データ量が多い場合は、非ピーク時間帯の実行やインクリメンタル更新の工夫が必要です。
DWHでのサマリーテーブル生成戦略(BI高速化)
BIダッシュボードやデータ分析では、クエリ応答速度がUXに直結します。リアルタイム性が不要な場合は、事前にサマリーテーブルを生成・参照することでパフォーマンスを劇的に改善できます。
戦略1:データレイク → ETLでサマリーテーブル生成
-- 月次売上を抽出して別テーブルに格納 INSERT INTO monthly_summary SELECT store_id, DATE_TRUNC('month', sale_date) AS month, COUNT(*) AS order_count, SUM(total) AS revenue FROM raw_orders WHERE sale_date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month') GROUP BY store_id, month;
戦略2:ビュー vs サマリーテーブル
| 手法 | メリット | デメリット |
|---|---|---|
| ビュー | 常に最新データを参照 | 大規模クエリでは遅い |
| マテリアライズドビュー / サマリーテーブル | 超高速。BIに最適 | 更新タイミングに注意が必要 |
おすすめ: ダッシュボードにはマテリアライズドビューを使用し、詳細データはオンデマンドで取得するハイブリッド構成が現場では多く採用されています。
まとめ
集計性能の最適化は、単にSQLをチューニングするだけでなく、「いつ・どこまで」計算するかを設計することが重要です。
- マテリアライズドビューで複雑集計を事前計算し、高速化
- 自動リフレッシュ戦略で鮮度とパフォーマンスを両立
- サマリーテーブル戦略でBIダッシュボードを最適化
これらの工夫により、リアルタイム性とスピード感を両立するデータ基盤を構築することができます。