テーブル・ビュー・MV:BI が重いときの設計判断
Stage 3 — 第4章 | データマネジメント入門 推定学習時間:40〜50分 | 難易度:★★★☆☆
この章で学ぶこと
Gold 層の mart_finance まで整えても、Looker を開くと 30 秒待たされる ことがあります。
原因はしばしば テーブル・ビュー・マテリアライズドビュー(Materialized View、MV) の選び方です。
さくら商事では、人気ダッシュボードが 毎回 2 億行をフルスキャン するビューに直結していました。 BigQuery のスロット課金も跳ね上がり、田中さんから苦情が来ます。
この章を終えると、こんなことができるようになります:
- テーブル、ビュー、MV の 動きとコスト の違いを説明できる
- 参照頻度・クエリの重さ・鮮度要求から 使い分け を判断できる
- BI 直結ビューのリスクを具体例で説明できる
- 「MV を張れば全部解決」という誤解を修正できる
1. 月次経営会議の前日
経営会議前日、木村さんが Looker の「全社 KPI」ダッシュボードを開きました。 ローディングが 45 秒。刷新しても 40 秒。
調査すると、Looker は次の ビュー を参照していました。
-- mart_finance_monthly_v(ビュー:中身は毎回計算)
CREATE VIEW mart_finance_monthly_v AS
SELECT
DATE_TRUNC(shipped_at, MONTH) AS month,
product_category,
SUM(total_amount) AS revenue,
COUNT(DISTINCT customer_id) AS buyers
FROM silver_orders o
JOIN silver_order_lines ol ON ...
JOIN silver_products p ON ...
WHERE ...
GROUP BY 1, 2;
ビューは保存された SELECT 句 です。 参照のたびに フル計算 が走ります。
鈴木
「会議で 20 人が同時に開いたら、同じ重いクエリが 20 本。MV か 事前集計テーブル を検討しよう。」
2. 三つのオブジェクト
| 種類 | 実体 | 更新 | 鮮度 | コスト感 |
|---|---|---|---|---|
| テーブル(Table) | データを 物理保存 | INSERT/ETL で更新 | バッチ間隔 | 保存 + 更新コスト |
| ビュー(View) | SQL 定義のみ | 参照時に都度計算 | 常に最新(上流次第) | 参照のたびに計算 |
| MV(Materialized View) | 結果を キャッシュ | 自動/定期 refresh | refresh 間隔 | 保存 + refresh コスト |
2.1 さくら商事での例
| オブジェクト | 種類 | 用途 |
|---|---|---|
silver_orders |
テーブル | Silver 層の基礎 |
mart_finance_monthly_v |
ビュー | 探索用(非推奨:会議直結) |
mart_finance_monthly |
テーブル | 公式月次(夜間 ETL 更新) |
mv_daily_revenue_by_category |
MV | 日次ダッシュボード(1 時間 refresh) |
3. ビューが向く・向かない
| 向く | 向かない |
|---|---|
| ロジック共通化(定義 1 箇所) | 大テーブル × 重 JOIN × 高頻度 |
| 参照が少ない | 会議直前の同時アクセス |
| 常に最新が必要で軽い | BI からの無制限アクセス |
さくら商事の教訓:
会議用 KPI に重いビューを直結しない。 Gold は テーブル or MV で提供し、Looker はそこから読む。
4. 使い分けフロー
判断軸は 頻度 × 重さ × 鮮度 の 3 つです。
参照頻度が高い?
No → ビューで十分なことが多い
Yes → クエリは重い?
Yes → 鮮度 1 時間で足りる?
Yes → MV
No → 事前集計テーブル(ETL)
No → ビュー or 軽量テーブル
次の図は、さくら商事の Looker 遅延を 設計で防ぐ ための分岐です。
が高い?"} B["ビュー
低頻度・軽量"] C{"クエリは
重い?"} D["ビュー or
軽量テーブル"] E{"鮮度 1h
で足りる?"} F["MV
キャッシュ"] G["事前集計
テーブル
公式 Gold"] A -->|No| B A -->|Yes| C C -->|No| D C -->|Yes| E E -->|Yes| F E -->|No| G WARN["BI 直結の重いビュー → 遅い・高コスト"] D -.-> WARN classDef decision fill:#fff7ed,stroke:#f97316,color:#1f2937 classDef ok fill:#f0fdf4,stroke:#16a34a,color:#1f2937 classDef table fill:#eff6ff,stroke:#2563eb,color:#1f2937 classDef warn fill:#fef2f2,stroke:#dc2626,color:#1f2937 class A,C,E decision class B,D ok class F fill:#fff7ed,stroke:#f97316,color:#1f2937 class G table class WARN warn
MV は銀の弾丸ではありません。 refresh コストと 定義変更時の再構築 も管理対象です。
5. 判断表(さくら商事版)
| シナリオ | 推奨 | 理由 |
|---|---|---|
| 経営会議・月次公式売上 | テーブル mart_finance_monthly |
鮮度 24h で可、説明責任・SSOT |
| マーケ日次ダッシュボード | MV 1h refresh | 高頻度、許容遅延 1h |
| AE の intermediate 確認 | ビュー | 参照少、最新で軽め |
| ad hoc 探索 | Silver テーブル直 + 限定 | コスト上限設定 |
| 全社同時 20 ユーザー | ビュー直結 禁止 | 同時フルスキャン |
5.1 鮮度(Timeliness)とのトレードオフ
| 要求 | 実装 | トレードオフ |
|---|---|---|
| リアルタイムに近い | CDC + 小さめ MV | 複雑・コスト |
| 日次で十分 | 夜間 ETL テーブル | シンプル・安い |
| 月次会議のみ | 月次テーブル | 最も安い |
公式売上は「最新 1 秒」より「説明可能で安定」 —— Stage 2 の合意と一致します。
6. MV の落とし穴
| 落とし穴 | さくら商事で起きうること |
|---|---|
| 上流変更で silently ズレ | Silver 列名変更 → MV 古い定義のまま |
| refresh 失敗に気づかない | 朝のダッシュボードが前日データ |
| 乱立 | MV が 50 個、どれが SSOT か不明 |
| コスト | 全表 refresh でスロット枯渇 |
対策:
- MV も Git 管理、リネージ 登録
- refresh 失敗アラート
- Gold テーブルを正、MV は読取加速の副本
7. Stage 3 の振り返り
| 章 | 問い |
|---|---|
| s3-p1 | 本番と分析を分けたか(OLTP/OLAP) |
| s3-p2 | 生・整形・提供の置き場所(lake/DWH/mart) |
| s3-p3 | 層の意味(Bronze/Silver/Gold) |
| s3-p4 | 物理オブジェクトの選び方(Table/View/MV) |
Stage 4 からは 品質と信頼 —— 層が上がっても、値が間違っていれば意味がありません。
体系コラム:カリキュラム上の位置づけ
| 項目 | 内容 |
|---|---|
| Stage / 章 | Stage 3 — 第4章「テーブル・ビュー・MV」(Stage 3 完結章) |
| 今回の論点 | 物理テーブル・ビュー・マテリアライズドビューの 使い分け判断 |
| DAMA 領域 | データストレージ・操作、DW & BI |
| ライフサイクル | 加工(実装)と活用(性能・鮮度)の接点 |
| 前章との接続 | メダリオン層 の Gold を、どう実装するか |
| 次章への伏線 | 品質 6 軸 — 正しいオブジェクト選びでも 値が間違えば 意味がない |
コラム:analytics との線引き
analytics トラックでは CTE でマート相当の中間表を作り、必要なら CREATE TABLE AS で物化します。本トラックでは、その判断を 組織ルール として固定します。
| 判断 | analytics の典型 | DM トラックの追加観点 |
|---|---|---|
| ビューで十分 | 探索分析、低頻度 | 公式指標はビューだけにしない(鮮度・説明責任) |
| MV を使う | 重い集計のキャッシュ | 更新 SLA とオーナー承認が必要 |
| テーブル化 | 再利用マート | SSOT 候補かどうかをカタログで明示 |
経営会議前日、鈴木さんは MV の更新遅延で古い数字が出た事故を経験しました。analytics でも DM でも、「速い」と「公式」は別問題 です。公式なら更新時刻と停止ルールまでセットで設計します。
まとめ
| オブジェクト | キーフレーズ |
|---|---|
| テーブル | 物理保存。公式 Gold に向く |
| ビュー | 定義の共有。軽量・低頻度向け |
| MV | キャッシュ。高頻度・許容遅延向け |
この章のキーメッセージ:
Looker が遅いのは BI ツールのせいだけではありません。 重いビューへの直結 は設計判断のミスです。 頻度・重さ・鮮度で Table / View / MV を選んでください。
次に読む
- 前章: Bronze / Silver / Gold
- Stage 4 第1章: データ品質の 6 軸
- 関連: BI ダッシュボード(analytics)
確認問題
問題 1
全社 KPI ダッシュボードが 2 億行 JOIN の ビュー に直結し、同時アクセスで遅い。 最も効果的な改善 はどれですか。
A. ダッシュボードの色を変える
B. 事前集計 テーブル または適切な MV に切り替え、Looker はそこから読む
C. ビューを増やして部門別に分ける
D. OLTP 本番から直接読む
正解: B
解説: 高頻度 × 重クエリは 物理化 が定石です。C は悪化、D は Stage 3-1 のインシデント再生です。
問題 2
「常に最新が必要」な要求について、さくら商事の 公式月次売上 に当てはめると最も適切なのはどれですか。
A. 秒単位の MV refresh が必須
B. 月次会議用途なら 日次〜月次バッチのテーブル で足りる。鮮度要求を業務と合わせて定義する
C. 鮮度は不要。10 年前のデータでよい
D. ビューなら自動的に最新になるので定義不要
正解: B
解説: 鮮度は 用途依存 です。公式月次はリアルタイム不要なことが多く、過剰な MV はコストだけ増えます。
問題 3
MV を 30 個作成し、どれが SSOT か分からなくなった。 データマネジメント上の問題 として最も適切なのはどれですか。
A. MV は SSOT にできないので問題ない
B. 加速用 MV と Gold 正本テーブル の役割が混同され、ガバナンス・リネージが崩れている
C. 30 個あれば品質が 30 倍
D. BigQuery が悪い
正解: B
解説: MV は 読取加速 の副本。正本は mart_* テーブル + カタログ + セマンティックレイヤー。乱立は野良マートと同型の問題です。
用語メモ(この章)
| 用語 | 意味(この章での使い方) |
|---|---|
| ビュー(View) | 保存された SELECT。参照時に計算 |
| マテリアライズドビュー(MV) | クエリ結果を物理キャッシュし refresh するオブジェクト |
| 事前集計テーブル | ETL で更新する集計結果テーブル(Gold 提供向け) |
| フルスキャン | 全行読み取り。大テーブル + 高頻度で高コスト |
| 鮮度(Timeliness) | データがどれだけ新しいか。用途とセットで決める |