はじめに:データを「ロードせずに」クエリしたい!
こんにちは!Snowflakeでデータ分析をしていると、「クラウドストレージ(S3やAzure Blobなど)に置いてあるファイルを、わざわざテーブルにロードしないでそのまま参照したい」と思ったことはありませんか?
そんなときに大活躍するのが 外部テーブル(External Table) です。外部テーブルを使うと、Amazon S3・Google Cloud Storage・Azure Blobなどに置いた CSV / JSON / Parquet ファイルを、まるでSnowflake内部のテーブルかのようにSQLでクエリできちゃいます。
この記事では、外部テーブルの仕組みと作り方、注意点までを初心者向けにやさしく解説します!

外部テーブルとは?
外部テーブルは、クラウドストレージにあるファイルをデータソースとする「読み取り専用の仮想テーブル」です。普通のテーブルと違って、Snowflakeの内部ストレージにはデータを保存しません。
イメージとしては「ファイルへのショートカットにスキーマ(列定義)を貼り付けたもの」と考えると分かりやすいです。クエリのたびに、Snowflakeが裏でファイルを読み取って結果を返してくれます。
普通のテーブルとの違い
- データの所有場所:外部テーブルはクラウドストレージ側、通常テーブルはSnowflake内部
- ロード作業:外部テーブルは COPY INTO 不要、ファイルを置くだけでOK
- 書き込み:外部テーブルは読み取り専用(INSERT/UPDATEできない)
- パフォーマンス:通常テーブルの方が速い(マイクロパーティション最適化が効くため)
外部テーブルの作り方
外部テーブルを作るには、まず 外部ステージ と ファイルフォーマット を準備します。
1. ステージとファイルフォーマットを準備
-- 外部ステージ(S3)を作成
CREATE OR REPLACE STAGE my_ext_stage
URL = 's3://my-bucket/sales/'
STORAGE_INTEGRATION = my_s3_int;
-- Parquet用ファイルフォーマット
CREATE OR REPLACE FILE FORMAT my_parquet_fmt
TYPE = PARQUET;
2. 外部テーブルを作成
CREATE OR REPLACE EXTERNAL TABLE sales_ext (
order_id NUMBER AS (VALUE:order_id::NUMBER),
amount NUMBER AS (VALUE:amount::NUMBER),
order_date DATE AS (VALUE:order_date::DATE)
)
LOCATION = @my_ext_stage
FILE_FORMAT = my_parquet_fmt
AUTO_REFRESH = TRUE;
外部テーブルは自動的に VALUE というメタデータ列を持ちます。VALUEにはファイル内の各レコード(1行)がVARIANT型として格納され、VALUE:カラム名::型のようにドット記法でフィールドにアクセスできます。ファイル全体ではなく、行単位での取り出しになる点に注意してください。
3. 普通にSELECTするだけ!
SELECT order_date, SUM(amount)
FROM sales_ext
WHERE order_date >= '2026-01-01'
GROUP BY order_date;
もうこれで、S3上のParquetファイルが普通のテーブルのようにクエリできます。

ユースケースと注意点
こんなときに便利!
- データレイク連携:S3に蓄積されたログを、ロードなしで分析したい
- お試し分析:本格的にロードする前に、ファイルの中身をSQLで確認したい
- 巨大ファイル:全部ロードするとストレージ料金がかさむデータの一部だけ参照したい
注意点
- クエリのたびにファイルを読むので、通常テーブルよりは遅い
- パーティション列(例:日付ごとのフォルダ分割)を定義すると、不要なファイルをスキップでき高速化できる
- ファイルが追加・更新されたことを検知するには
AUTO_REFRESH = TRUEを設定(裏でイベント通知が必要) - 頻繁に集計するデータは、最終的に通常テーブルへ Snowpipe でロードした方が速い場合も多い
まとめ
外部テーブルは「ロードせずにクラウドストレージのファイルを直接クエリする」という、データレイク時代にぴったりの便利機能です。COPY INTOによるバルクロードと使い分けることで、コストとパフォーマンスのバランスを取った設計ができますよ。
まずはS3に置いたCSVやParquetを外部テーブルにして、SELECTしてみてください!
参考リンク
関連記事
- Snowflakeステージとは?内部・外部ステージをやさしく解説 – 外部テーブルの前提となる「外部ステージ」の作り方を解説
- Snowflake COPY INTOでファイルからテーブルへデータ投入する方法 – 外部テーブルとは対照的な「ロードする方式」のおさらい
- Snowpipeで自動取り込み!ファイルアップロードを検知する方法 – 自動取り込みのもうひとつの選択肢
- Snowflakeファイルフォーマットの作り方と使い方をやさしく解説 – 外部テーブル定義に必要なFILE FORMATの基本
- Snowflake対応ファイル形式まとめ|CSV/JSON/Parquet/Avroの違い – 外部テーブルで扱える代表的な形式の違い
- Snowflake VARIANT型でJSONをロード!半構造化データ入門 – VALUE列で活躍するVARIANT型の解説
- Snowflakeのテーブル種類|通常・一時・トランジェントの違いを解説 – 通常テーブルとの使い分けの参考に
- Snowflakeデータロードの全体像|バルク・ストリーミング・サードパーティをやさしく解説 – データ取り込み手法全体の俯瞰

