ディレクトリテーブルとは
外部ステージの情報をSnowflake側でメタデータとして保持していくもの
外部ステージにあるファイルの最終更新日などを保持しておくことで
そのデータがINSERT対象なのかそうでないかなど判断することができる
デフォルトでは無効になっており、Snowflake側でTRUE
にしておく必要性がある
CREATE STAGEコマンドのDIRECTORY
オプションで設定を行うことが可能
CREATE STAGE my_external_stage
URL = 's3://my-bucket/path/'
STORAGE_INTEGRATION = my_integration
DIRECTORY = (ENABLE = TRUE AUTO_REFRESH = TRUE);
AUTO_REFRESH
というオプションが急に出てきましたが、こちらの解説をします。
AUTO_REFRESH
ディレクトリテーブルは前述の通り、外部ステージにあるファイルのメタデータを管理するものです。
しかしながら、こちらは自動的に更新されるものではなく、ユーザー自身が自動更新を設定するか
ALTER
コマンドを実行して、手動で更新するかどちらかになります。
おそらくこのようにAUTO_REFRESHは動いている??
Snowflakeのドキュメントにも
「クラウドプロバイダーのストレージイベント通知機能を利用している」
との記載がありました。
おそらく以下のような挙動でAUTO_REFRESHは動いているんだなと仮説してます。
①S3に新しいデータがアップロードされる
②S3イベント通知がトリガーされ、SNSトピックやSQSキューに通知が送られる
③Snowflakeのリスナーがその通知を受け取り、対応する外部テーブルやマテリアライズドビューを更新する
この仕組みにより、Snowflakeはデータの変更を即座に検知し、最新のデータに基づいてクエリを実行できるようになっているのではないかなと思っております。