テックカリキュラム

マテリアライズドビューとサマリー最適化

マテリアライズドビューとサマリー最適化

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_TRUNCGROUP 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 を付けると同時アクセス中でもロックを避けて更新可能(ただしインデックス必須
  • 定期実行には cronpg_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ダッシュボードを最適化

これらの工夫により、リアルタイム性とスピード感を両立するデータ基盤を構築することができます。