🗂

【Snowflake】アーキテクチャ理解のためのハンズオン&確認問題

に公開

このページは、親記事のうち、1.6節と1.7節の内容です。
Snowflakeについてさらに学習したい方は、親記事から各ページをご参照ください。


1.6. 1章のハンズオン

1.6.0. 注意事項

テーブルのセットアップなどの手順は記載していません。
テーブル名・カラム名などはダミーで入れているので、各自の環境に沿って指定をしてください。
特段実行環境がない方は、以下リンクからセットアップしてみてください。
公式:Snowflake入門 - ゼロからはじめるSnowflake

1.6.1. 結果キャッシュ、データキャッシュの動作確認

〇目的:結果キャッシュとデータキャッシュの違いを体感する

〇手順1:以下のクエリを実行し、実行時間を記録する

SELECT id, a_datetime
FROM tb_aaa
WHERE a_datetime >= '2025-08-02'
limit 30;

〇手順2:同じクエリをもう一度実行し、実行時間を比較する

〇手順3:以下のクエリを実行する(少しだけ条件を変える)

SELECT id, a_datetime
FROM tb_aaa
WHERE a_datetime >= '2025-08-01' -- 日付を変更
limit 30;

〇手順4:結果キャッシュを無効化

ALTER SESSION SET USE_CACHED_RESULT = FALSE; -- 結果キャッシュを無効化
SHOW PARAMETERS LIKE 'USE_CACHED_RESULT%'; -- 結果キャッシュの設定値を表示

〇手順5:手順3と同じクエリを実行する

〇手順6:結果キャッシュを有効化(もとに戻す)

ALTER SESSION SET USE_CACHED_RESULT = TRUE; -- 結果キャッシュを有効化
SHOW PARAMETERS LIKE 'USE_CACHED_RESULT%'; -- 結果キャッシュの設定値を表示

〇確認ポイント:
手順2では結果キャッシュが効いて、ほぼ0秒で実行されるか?
手順3では結果キャッシュは効かないが、データキャッシュは効いており、手順1より速いか?
手順5では結果キャッシュが効かず、手順3とあまり実行時間は変わらないか?

1.6.2. メタデータキャッシュの動作確認

〇手順1:以下を1つずつ実行、都度確認ポイントを確認

-- メタデータのみで答えられるクエリ
SELECT COUNT(*) FROM tb_aaa;
SELECT MIN(a_datetime), MAX(a_datetime) FROM tb_aaa;
SELECT COUNT(DISTINCT address) FROM tb_aaa;

〇手順2:以下を順に実行

-- テーブルスキャンが必要なクエリ
SELECT COUNT(*) FROM tb_bbb WHERE a_datetime >= '2025-08-01';
SELECT AVG(a_datetime) FROM tb_bbb;

〇確認ポイント:
手順1のクエリはほぼ瞬時に実行されるか?
手順1のクエリはクエリプロファイルで「Partitions scanned = 0」になっているか?
手順2のクエリはクエリプロファイルで「Partitions scanned = 0」になっていないか?

1.6.3. パーティションプルーニングの動作確認

〇手順1:以下クエリを実行、Query Profileで「Partitions scanned」と「Partitions total」と実行時間を確認する

-- プルーニングが効くクエリ
SELECT COUNT(*)
FROM tb_ccc
WHERE a_datetime >= '2025-10-01';

〇手順2:以下クエリを実行、Query Profileで「Partitions scanned」と「Partitions total」と実行時間を確認する

-- プルーニングが効きにくいクエリ
SELECT COUNT(*)
FROM tb_ccc
WHERE TO_CHAR(a_datetime, 'YYYY-MM-DD') >= '2025-10-01';

〇確認ポイント:
手順1のクエリは手順2のクエリと比べて読み込んでいるパーティションが少なく、効率的に実行できているか?
(ただし、ウェアハウスを停止していないため、データキャッシュが効いている可能性がある)


1.7. 確認問題

【Q1】
Snowflakeの3層アーキテクチャの各レイヤー名を答えてください。

こたえ

【A1】
・クラウドサービスレイヤー
・コンピュートレイヤー
・ストレージレイヤー

【Q2】
クラウドサービスレイヤーの主な役割を3つ挙げてください。

こたえ

【A2】
(以下から3つ)
認証
アクセス制御
インフラストラクチャ管理
メタデータ管理
クエリの解析および最適化

【Q3】
ウェアハウスはどのレイヤーに属しますか?

こたえ

【A3】
コンピュートレイヤー

【Q4】
3層アーキテクチャにおいて、「Shared-Nothing」と「Shared-Everything」のハイブリッド構成とはどういう意味ですか?

こたえ

【A4】
ストレージは共有(Shared-Everything)しつつ、計算リソース(Compute)は独立(Shared-Nothing)させることで、柔軟性とパフォーマンスを両立している構成のこと。

【Q5】
活用例において、業務DBとDWHではそれぞれ何が使われていますか?また、それぞれ行指向・列指向のどちらですか?

こたえ

【A5】
業務DB: Oracle(行指向)
DWH: Snowflake(列指向)

【Q6】
全く同じテーブルの状態で、全く同じクエリを実行した場合に使われるキャッシュは何ですか?どのレイヤーで動作しますか?

こたえ

【A6】
結果キャッシュ / クラウドサービスレイヤー

【Q7】
ウェアハウスのSSDに保存され、ウェアハウスを停止するまで利用できるキャッシュは何ですか?

こたえ

【A7】
データキャッシュ

【Q8】
メタデータのみで結果を返せるクエリの例を2つ挙げてください。

こたえ

【A8】
(以下から2つ)
テーブルの行数(COUNT(*))
各カラムのdistinct値の個数
NULL値の個数
カラムのmin・max値

【Q9】
性能検証時に結果キャッシュをオフにすることを検討すべき理由は何ですか?

こたえ

【A9】
結果キャッシュが有効だと、実際よりも格段に速く実行できてしまい、正確な性能測定ができないため。

【Q10】
XSサイズのシングルクラスタウェアハウスとLサイズのシングルクラスタウェアハウスとでは、コンピュートノードの個数は何倍になりますか?

こたえ

【A10】
8倍
(XS=1, S=2, M=4, L=8...とサイズが1段階上がるごとに倍になる)

【Q11】
Snowflakeのウェアハウスにおけるスケールアップとスケールアウトの違いを説明してください。

こたえ

【A11】
スケールアップ: ウェアハウスサイズを大きくすること。単一クエリの処理速度向上に効果がある
スケールアウト: マルチクラスタウェアハウスでクラスタ数を増やすこと。同時実行数の増加に効果がある

【Q12】
「A業務チームとB業務チームで同じデータを使うクエリを実行する場合、ウェアハウスを分けたほうがよい」というのは、データキャッシュの観点で正しいですか?

こたえ

【A12】
いいえ、正しくない。
同じデータを利用するクエリは同じウェアハウスで実行した方が、データキャッシュを効率的に利用できる。
ただし、ワークロード特性が大きく異なる場合や、リソース競合を避けたい場合は分けることもある。

【Q13】
Snowflakeのマイクロパーティションの圧縮前のサイズはどのくらいですか?

こたえ

【A13】
50MB〜500MB程度

【Q14】
列指向ストレージが行指向ストレージよりも圧縮効率が高い理由は何ですか?

こたえ

【A14】
同じ種類のデータが連続して保存されるため、圧縮アルゴリズムが効率よく働くから。
(行指向ではデータ型が混在するため圧縮効率が低い)

【Q15】
パーティションプルーニングとは何ですか?

こたえ

【A15】
クエリ実行時に、WHERE句の条件などをもとに、不要なマイクロパーティションを読み込まずにスキップする最適化手法。
各パーティションが保持している最小値・最大値のメタデータを使って判断する。

【Q16】
次のwhere句でパーティションプルーニングが効かない理由を説明してください。
WHERE product_name LIKE '%insurance%'

こたえ

【A16】
先頭にワイルドカード(%)があるため、1文字目での判定ができず、プルーニングが効かない。

【Q17】
次のwhere句でパーティションプルーニングが効かない可能性がある理由を説明してください。
WHERE TO_CHAR(a_datetime, 'YYYY-MM-DD') = '2025-10-01'

こたえ

【A17】
カラムに関数をかませているため、Snowflakeがパーティションのメタデータ
(min/max)と直接比較できず、プルーニングが効かない可能性がある。

【Q18】
次のwhere句を、パーティションプルーニングが効くように書き直してください。
WHERE TO_CHAR(a_datetime, 'YYYY-MM-DD') = '2025-10-01'

こたえ

【A18】
WHERE a_datetime >= '2025-10-01'
AND a_datetime < '2025-10-02'
など

【Q19】
ステージからファイルをロードする際の推奨ファイルサイズ(圧縮後)はどのくらいですか?

こたえ

【A19】
100MB〜250MB

【Q20】
大きなファイルを分割せずにロードする場合、ウェアハウスのサイズを大きくしてもロード速度が速くならない理由は何ですか?

こたえ

【A20】
ファイルを分割しないと複数ノードで並列ロードできないが、ノード1つ1つの性能はウェアハウスサイズに関係ないため、単一ファイルのロードは速くならない。

Discussion