第4章 パフォーマンス最適化・クエリ・変換 / 想定学習時間:30〜40分 / 最終確認:2026年8月

4-4. 検索最適化サービス・マテリアライズドビュー・クラスタリングキーの使い分け

🎯 この節の学習目標

1. 「どのクエリを速くしたいか」で機能を選ぶ

Snowflake には、ウェアハウスのサイズ調整(4-3)とは別に、ストレージ側・メタデータ側でクエリを速くする3つの機能があります。どれも「テーブルに仕掛けを追加してスキャンや計算を減らす」点は同じですが、効くクエリパターンがまったく違うため、症状に合わない機能を選ぶとコストだけが発生します。本節はこの3つの使い分けを軸に学びます。

2. 検索最適化サービス(Search Optimization Service)

検索最適化サービスは、Enterprise エディション以上で利用できる機能で、テーブルの背後に検索アクセスパスと呼ばれる補助構造を作り、ポイントルックアップ(選択行数がごく少ない検索)を高速化します。通常のプルーニングでは絞り込めない「値がどのマイクロパーティションにあるか」を直接特定できるようになるイメージです。

高速化される代表的なクエリパターンは次のとおりです。

💡 具体例:テーブル/列単位での有効化

-- テーブル全体の等価検索を最適化する
ALTER TABLE support_logs ADD SEARCH OPTIMIZATION;

-- 特定の列・検索方法に絞って有効化することもできる
ALTER TABLE support_logs ADD SEARCH OPTIMIZATION
  ON EQUALITY(user_id), SUBSTRING(message);

問い合わせログの中から特定ユーザーの行だけを探す、といった「巨大テーブルからの数行の取り出し」が典型的な適用場面です。検索アクセスパスの構築・維持はサーバーレスで行われ、その分のサーバーレス課金(コンピュート)と追加ストレージ課金が発生します。

3. マテリアライズドビュー

マテリアライズドビュー(materialized view)は、クエリ結果を事前計算して物理的に保存しておくビューです。こちらも Enterprise エディション以上の機能です。通常のビュー(クエリのたびに定義を実行する「保存されたSQL」)と違い、結果が実体化されているため参照が高速です。

特徴内容
対象は単一テーブル定義クエリは1つのテーブルに対するもので、結合(JOIN)は不可。集計(GROUP BY)や一部の集計関数は使えるが、制約がある
自動メンテナンス元テーブルが変更されると、Snowflakeがバックグラウンド(サーバーレス)で自動更新する。ユーザーによるリフレッシュ操作は不要
自動書き換え(自動利用)ユーザーが元テーブルを参照するクエリを書いても、クエリオプティマイザが「マテリアライズドビューを使ったほうが速い」と判断すれば自動的に書き換えて利用する
課金自動メンテナンスのサーバーレスコンピュート課金+実体データのストレージ課金
-- 日次集計を事前計算しておく
CREATE MATERIALIZED VIEW daily_sales_mv AS
SELECT order_date, SUM(amount) AS total_amount, COUNT(*) AS cnt
FROM sales
GROUP BY order_date;

📝 試験のポイント

マテリアライズドビューの3点セット——①単一テーブルのみ(結合不可)、②メンテナンスはSnowflakeが自動(サーバーレス課金)、③オプティマイザが自動で利用(クエリの書き換え不要)——はそのまま出題ポイントです。更新が非常に多いテーブルではメンテナンスコストが利益を上回る、という判断軸もあわせて覚えておきましょう。

4. クラスタリングキーと自動クラスタリング(復習)

1-6 で学んだとおり、クラスタリングキーは「指定した列の値が近い行どうしが同じマイクロパーティションに集まる」ようにデータの物理配置を整える仕組みで、指定後は Automatic Clustering(サーバーレス)が並び替えを維持します。非常に大きなテーブルに対する範囲フィルタ・等価フィルタのプルーニング効率を改善します。

-- 日付列でのフィルタが多い大テーブルにクラスタリングキーを設定
ALTER TABLE sales CLUSTER BY (order_date);

ポイントルックアップの検索最適化サービスとは対照的に、クラスタリングは「ある程度の範囲を読むが、その範囲が全体のごく一部」というクエリ(例:1年分のデータから特定の1週間を抽出)に向きます。並び替えの維持にはサーバーレス課金が発生するため、更新の激しいテーブルではコストに注意が必要です。

5. 使い分けの比較表と選択フロー

4つの手段(3機能+ウェアハウスサイズ調整)を並べて比較します。この表が本節の核心です。

検索最適化サービスマテリアライズドビュークラスタリングキーWHサイズ調整
対象クエリパターン等価・IN・部分文字列などのポイントルックアップ(返る行がごく少ない)繰り返し実行される集計・変換(単一テーブル)大テーブルの範囲フィルタ(日付範囲など)あらゆる重いクエリ全般(スピル解消など)
エディションEnterprise 以上Enterprise 以上全エディション全エディション
課金形態サーバーレス(構築・維持)+ストレージサーバーレス(自動更新)+ストレージサーバーレス(Automatic Clustering)ウェアハウスのクレジット消費率が増加
設定単位テーブル/列・検索方法単位ビューとして定義テーブル単位(列・式を指定)ウェアハウス単位
速くしたいクエリのパターンを特定Query Profile(4-1)で症状を確認してから選ぶ
特定の1件・少数行を探す等価/IN/部分文字列 → 検索最適化サービス
同じ集計を何度も実行単一テーブルの集計 → マテリアライズドビュー
大テーブルの範囲絞り込み日付範囲フィルタなど → クラスタリングキー
全体的に重い・スピル発生→ ウェアハウスのサイズ調整(4-3)
導入後は効果(プルーニング・実行時間)とサーバーレスコストを確認
効果とコストのバランスを評価効いていなければ設定を見直す・外す

図:クエリパターン → 適する高速化機能の選択分岐

✅ この節のまとめ

練習問題

問1. 数十億行のログテーブルに対して「WHERE session_id = '...'」のように特定IDの数行だけを取り出すクエリが多数実行されており、毎回テーブルの大部分がスキャンされて遅い。最も適切な機能はどれか。

  1. マテリアライズドビュー
  2. 検索最適化サービス
  3. クエリ結果キャッシュの有効化
  4. マルチクラスタウェアハウス
解答と解説を見る

正解:B

「巨大テーブルから等価条件でごく少数の行を探す」はポイントルックアップの典型で、検索最適化サービスの主対象です。Aのマテリアライズドビューは繰り返しの集計向けで、任意のIDによる検索には対応できません。Cの結果キャッシュは同一クエリの再実行にしか効かず、IDが毎回異なる検索には効きません。Dは同時実行の問題(キュー待ち)への対策で、スキャン量は減りません。

問2. マテリアライズドビューの説明として誤っているものはどれか。

  1. 元テーブルの変更は、Snowflakeがバックグラウンドで自動的にビューへ反映する
  2. ユーザーが元テーブルを直接参照するクエリでも、オプティマイザが自動的にマテリアライズドビューを利用することがある
  3. 複数テーブルを結合した結果を事前計算するために使うのが典型的な用途である
  4. 自動メンテナンスにはサーバーレスのコンピュート課金と、実体データのストレージ課金が発生する
解答と解説を見る

正解:C

Snowflakeのマテリアライズドビューは単一テーブルに対する定義のみ可能で、結合(JOIN)は使えません。集計は可能ですが制約があります。A・B・Dはいずれも正しい説明で、特にBの「オプティマイザによる自動書き換え」は、既存クエリを修正しなくても恩恵を受けられるという重要な特徴です。

問3. 5年分・数TBの売上テーブルに対し、「直近1か月」「特定の四半期」など日付範囲で絞り込む分析クエリが中心だが、Query Profile ではほぼ全パーティションがスキャンされている。最も適切な対策はどれか。

  1. order_date 列にクラスタリングキーを設定し、Automatic Clustering に維持させる
  2. テーブル全体に部分文字列検索の検索最適化を有効化する
  3. SELECT * を実行してウェアハウスキャッシュを温めておく
  4. テーブルを通常のビューでラップする
解答と解説を見る

正解:A

大テーブル+範囲フィルタ+プルーニング不良、という組み合わせはクラスタリングキーの典型的な適用場面です。日付列でクラスタリングすれば、範囲条件に合致しないマイクロパーティションが効率よく除外されます。Bの部分文字列検索の最適化は文字列のポイントルックアップ向けで、日付範囲には不適切です。Cはウェアハウス稼働中しか効かず、根本対策になりません。Dの通常のビューは定義を保存するだけで、性能は変わりません。

問4. 検索最適化サービス・マテリアライズドビュー・クラスタリングキーに共通する特徴として正しいものを2つ選べ。

  1. メンテナンス(構築・維持・自動更新)がサーバーレスで行われ、その分の課金が発生する
  2. いずれも Standard エディションで利用できる
  3. 効果が出るのは特定のクエリパターンに限られるため、対象クエリを見極めてから導入すべきである
  4. 有効化すると、既存のクエリをすべて書き換える必要がある
解答と解説を見る

正解:A、C

3機能とも維持管理はSnowflakeがサーバーレスで行い、使った分の課金が発生します。また、それぞれ効くクエリパターン(ポイントルックアップ/繰り返し集計/範囲フィルタ)が異なるため、症状の見極めが導入判断の前提です。Bは誤りで、検索最適化サービスとマテリアライズドビューは Enterprise 以上が必要です(クラスタリングキーは全エディション)。Dは誤りで、3機能ともクエリの書き換えは不要です(マテリアライズドビューもオプティマイザが自動利用します)。