🐙
【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