🐙

【Snowflake】ストレージレイヤーと効率的なクエリ実行

に公開

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


1.5. ストレージレイヤー

1.5.1. ストレージレイヤーの役割

1.2.1. 3層アーキテクチャの各レイヤーの役割から転記

  • ストレージレイヤー
    • クラウドオブジェクトストレージにデータを保持。
    • データは内部の最適化された列指向形式に再編成(マイクロパーティショニング)。

1.5.2. (前提知識)行指向 vs 列指向

観点 行指向 列指向
データ保存単位 レコード単位 カラム単位
適した処理 トランザクション(OLTP) 分析・集計(OLAP)
圧縮効率 低い(データ型が混在するため) 非常に高い(同じ種類のデータが連続するため)
活用例 業務DB(Oracle) DWH(Snowflake)

公式:データストレージ

1.5.3. マイクロパーティショニング

Snowflakeは、テーブルを自動的にマイクロパーティション(サイズは圧縮前で50MB〜500MB程度)に分割し、その中で物理的には列指向でデータを保持。
マイクロパーティション概念図
公式:マイクロパーティションより

  • 各パーティションに保持されている最小値・最大値をもとに、クエリ時のプルーニング(不要なパーティションは参照しない)を実現。
    • 例:where a_datetime > '2025-10-01 08:00:00' というwhere句だった場合、最大値が2025-10-01 08:00:00よりも小さいパーティションは参照しない。
  • クラスタリングキーを設定して、明示的にマイクロパーティションを再編成することもできる。
    • where句やJOINのキーになることが多いものをクラスタリングキーにすると、パーティションプルーニングが効果的になることが多い

公式:マイクロパーティション
公式:クラスタリングキー

1.5.4. 効率的なクエリ実行のために(ストレージレイヤー観点)

  • パーティションプルーニングの利用
    • 文字列の場合、where col1 like '%claim%' のような指定をすると、1文字目での判定ができないためプルーニングが効かない
    • また、where to_char(a_datetime, 'YYYY-MM-DD') = '2025-10-01' のように、カラムに関数をかませるとプルーニングが効かないことがある

公式:クエリプルーニング

Discussion