Agile育成ブログ
未来を変える喜びを
未分類

プルーニングが使えない理由

クエリ1:プルーニングが「使える」理由

WHERE C_CUSTOMER_SK between 100000 and 600000
AND C_LAST_NAME LIKE 'Johnson'

理由:データの「並び順」と「メタデータ」の相性が良い

  • ID(SK)の連続性: C_CUSTOMER_SK(サロゲートキー)のような連番のIDは、通常、データがロードされた順序と一致します。Snowflakeはデータをロード順にマイクロパーティションに分割するため、各パーティションの C_CUSTOMER_SK の「最小値〜最大値」の範囲が非常に狭く、重複しにくくなります。
  • 劇的な絞り込み: 「10万から60万の間」という条件があれば、Snowflakeのメタデータを見るだけで、「このファイルは1〜5万だから無視」「このファイルは10〜15万だから読む」と、読むべきファイルを物理的に切り捨て(プルーニング)できます。

クエリ2:プルーニングが「効きにくい」理由

WHERE C_LAST_NAME = 'Johnson'

理由:データの「散らばり」が大きすぎる

  • 名前のランダム性: データのロード順が「名前順」になっていない限り、C_LAST_NAME(姓)はあらゆるマイクロパーティションに分散して保存されます。
  • メタデータの限界: 全てのパーティションのメタデータ(最小値〜最大値)が「Aさん〜Zさん」という広い範囲をカバーしてしまっている場合、Snowflakeは「’Johnson’ さんがどのファイルにいるか分からない(=全ファイルにいる可能性がある)」と判断します。
  • 結果: 結局、ほぼ全てのパーティションをスキャンしなければならなくなり、パフォーマンスが低下します。

3. なぜ「LIKE」と「=」の違いではないのか?

ここで重要なのは、演算子が LIKE= かではなく、「フィルタリングするカラムが、データの物理的な並び順(クラスタリング)を反映しているか」です。

比較項目クエリ1 (C_CUSTOMER_SK)クエリ2 (C_LAST_NAME)
主なフィルタ数値の範囲指定(連番)文字列の完全一致(ランダム)
データの偏り特定のファイルに固まっている全ファイルに散らばっている
プルーニング非常に効きやすい効きにくい(全スキャンに近い)
処理速度速い(読まないファイルが多い)遅い(ほぼ全部読む)

クエリ1(成功): 「本のIDが100番〜200番の本を持ってきて」

  • 司書(Snowflake)は「100番台の棚」だけを見ればいいので、一瞬で終わります。

クエリ2(失敗): 「著者が『佐藤さん』の本を全部持ってきて」

  • 本が著者順に並んでいない場合、司書は図書室の全ての棚を端から端までチェックして「佐藤さん」を探す必要があります。これが「プルーニングが効かない」状態です。