はじめに
Databricksに新しく一時テーブル(Temporary Table) 機能がパブリックプレビューとして追加されました。従来から存在する一時ビュー(Temporary View)と似ているようで異なるこの機能、どう使い分けるべきか整理してみました。
一時テーブルとは
一時テーブルは、Databricksセッションの期間中のみデータを保持するテーブルです。カタログに永続テーブルを作成せずに、探索的分析やSQLパイプラインの中間結果をマテリアライズできます。
主な特徴は以下の通りです。
- セッション終了時に自動削除(最大7日間)
- Unity Catalogの
CREATE TABLE権限が不要 - 他のユーザーからは見えない(セッション分離)
- DML操作(INSERT/UPDATE/MERGE)が可能
- 現時点ではSQLウェアハウスのみ対応
一時テーブルと一時ビューの違い
両者の根本的な違いはデータの保持方法です。
| 観点 | 一時テーブル | 一時ビュー |
|---|---|---|
| データ保持 | 物理的に保存(マテリアライズ) | クエリ定義のみ保存 |
| 実行タイミング | 作成時に1回だけ実行 | 参照するたびに実行 |
| DML操作 | INSERT/UPDATE/MERGE可能 | 不可(読み取り専用) |
| ストレージ | クラウドストレージを消費 | 消費しない |
| DataFrame API | 未対応 |
createOrReplaceTempView()対応 |
| 対応コンピュート | SQLウェアハウスのみ | 全コンピュートタイプ |
| 最大有効期間 | 7日間 | セッション終了まで |
一時テーブルを試してみる
一時テーブルの作成
空のテーブルを定義して作成する方法と、クエリ結果から作成する方法があります。
-- 空の一時テーブルを作成
CREATE TEMPORARY TABLE temp_customers (
id INT,
name STRING,
email STRING
);
OK
-- クエリ結果から一時テーブルを作成
CREATE TEMP TABLE temp_sample_data AS
VALUES
(1, 'Alice', 100.00),
(2, 'Bob', 200.00),
(3, 'Charlie', 150.00)
AS t(id, name, amount);
一時テーブルのクエリ
単一パート名で参照します。カタログやスキーマの指定は不要です。
SELECT * FROM temp_sample_data;
DML操作
一時ビューではできないDML操作が可能です。
-- データの挿入
INSERT INTO temp_customers VALUES (101, 'Jane Doe', 'jane@example.com');
SELECT * FROM temp_customers;
-- データの更新
UPDATE temp_sample_data
SET amount = amount * 1.1
WHERE id = 1;
SELECT * FROM temp_sample_data;
一時テーブルの削除
セッション終了時に自動削除されますが、明示的に削除することも可能です。
DROP TEMP TABLE IF EXISTS temp_customers;
DROP TEMP TABLE IF EXISTS temp_sample_data;
使い分けの判断フロー
どちらを使うか迷ったら、以下のフローで判断できます。
- DML操作が必要? → Yes → 一時テーブル
- 同じ結果を複数回参照する? → Yes → 一時テーブル(計算コスト削減)
- DataFrameとの連携が必要? → Yes → 一時ビュー
- 常に最新データが必要? → Yes → 一時ビュー
- SQLウェアハウス以外で使う? → Yes → 一時ビュー
- それ以外 → 一時ビュー(軽量でシンプル)
一時テーブルが向いているケース
重い集計結果を複数回参照する場合、一時テーブルなら1回の計算で済みます。
-- 重い集計を1回だけ実行してキャッシュ
CREATE TEMP TABLE temp_daily_summary AS
SELECT date, SUM(amount) as total
FROM prod.sales.orders
GROUP BY date;
-- 何度参照しても再計算されない
SELECT * FROM temp_daily_summary WHERE total > 10000;
SELECT AVG(total) FROM temp_daily_summary;
一時ビューが向いているケース
DataFrameで前処理した結果をSQLで分析したい場合は一時ビュー一択です。
# DataFrameで複雑な前処理
df = (spark.read.table("prod.sales.orders")
.filter(col("amount") > 100)
.withColumn("tax", col("amount") * 0.1))
# SQLから参照可能にする
df.createOrReplaceTempView("prepared_orders")
-- SQLで分析
SELECT customer_id, SUM(amount) FROM prepared_orders GROUP BY 1
制限事項
一時テーブルには以下の制限があります。
-
CREATE OR REPLACE TEMP TABLEは未対応(削除してから再作成が必要) -
DELETE FROMは未対応(MERGE INTOで代替) -
ALTER TABLEは未対応(スキーマ変更には再作成が必要) - タイムトラベル、クローン作成は未対応
- ストリーミングクエリでは使用不可
- DataFrame APIは未対応
まとめ
一時テーブルは「SQLファーストの探索的分析」や「SQLパイプラインの中間結果のマテリアライズ」に向いています。一方、DataFrameとの連携やコンピュートタイプの汎用性を重視するなら、従来の一時ビューが適切です。




