Snowflakeの内部ステージについて調べてみた

2020.05.28

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

Snowflakeには「ステージ」というSnowflakeのテーブルにファイルからデータをロードする際に、そのファイルを置く場所があります。

「ステージ」の種類としては大きく2つあり、Snowflake内部にある「内部ステージ」と、各種クラウド上(Amazon S3, Google Cloud Storage, Microsoft Azure)に存在するファイルとの架け橋になる「外部ステージ」があるのですが、今回はこのうちの「内部ステージ」について改めて調査、整理してみました。

内部ステージの種類

内部ステージとしては3つの種類があり、それぞれ「ユーザーステージ」、「テーブルステージ」、「名前付きステージ」があります。詳しくは以下の公式ドキュメントに記載されています。

ユーザーステージ

このステージは「ユーザー」に紐づくステージです。各ユーザーにデフォルトで割り当てられています。ユーザーに紐づくのでファイルへのアクセスは自分のみとなり、ファイルは各テーブルにCOPYすることができます。 また、COPYには対象テーブルへのINSERT権限が必要となります。

以下のようなイメージとなります。

では、実際にステージの中身を少しみてみます。ワークシートで以下のコマンドを実行します。

LIST @~

特にこれまで明示的にPUTをしたことはなかったのですが、ワークシートのデータが入っているようですね。

テーブルステージ

このステージは「テーブル」に紐づくステージです。各テーブルにデフォルトで割り当てられています。テーブルに紐づくのでファイルへのアクセスは複数ユーザとなり、ファイルは紐づいているテーブルのみにCOPYすることができます。 また、ステージを利用するには対象テーブルのOWNERSHIP権限が必要となります。

以下のようなイメージとなります。

こちらも実際にステージの中身を少しみてみます。ワークシートで以下のコマンドを実行します。OWNERSHIP権限を持っているテーブルが対象なので、事前にテーブルは作成済みです。

LIST @%TEST

こちらは想定通り、空ですね。

名前付きステージ

このステージはデータベースオブジェクト扱いのステージです。各ユーザや各テーブルと紐づくものではないので、自由に利用、権限制御が可能です。 逆に、自分だけが利用するのであれば「ユーザーステージ」を、単一のテーブルに対して利用するのであれば「テーブルステージ」を使うという使い分けですね。

以下のようなイメージとなります。

こちらはまだステージを作成していないので試せませんでしたが、例えばmy_stageというステージを作成している場合には、以下のようなコマンドで確認可能なようです。

LIST @my_stage

まとめ

以上、Snowflakeの「内部ステージ」について調べてみました。利用用途によって使い分けが必要そうなので、うまく使い分けていきたいですね。今後は各種ステージそれぞれについて、細かく使い方を見ていきたいなと思います。

どなたかのお役に立てば幸いです。それでは!