0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SnowFlakeの一時テーブルと仮テーブルの違い SQL有り

Posted at

一時テーブルと仮テーブルの違い

主な違いとして、持続性とアクセスの違いです

image.png

持続性とアクセス

TEMPORARY(一時テーブル)については、セッション中のユーザーのみに対してアクセスができるので
共有することができません。

対して、TRANSIENT(仮テーブル)については、他ユーザーに対して共有することができます。

また、TEMPORARYについてはセッションが終われば削除されますが
TRANSIENTについては明示的に削除しないと残り続けます。

Fail-safe期間

こちらについては、非仮テーブルのため
どちらについてもFail-safe期間は0になります。

命名競合について

こちらについては、結論から言うと非仮テーブルと同じテーブル名にすることは可能です

ただし、セッションでは、同じスキーマ内の同じ名前の他のテーブルよりも仮テーブルが優先されることに注意してください。これにより、特に仮テーブルと非仮テーブルの両方で DDL を実行する場合、潜在的な競合と予期しない動作が発生する可能性があります。

一時テーブルはETLなどには使いたいテーブル

TRANSIENT(仮テーブル)は、セッション外でもデータが残り続けると言いました。

ETLそのもののデータはセッション中のみ欲しいので、この場合は
TEMPOLALYテーブルを使うことをお勧めします。

あとは、MERGE INTOなどで仮テーブルと本番テーブルを結合したりするのにも適しているかなと思います。

image.png

実際のSQLはこんな感じになります。

-- LIKEを使って、本番テーブルとスキーマを一致させる
CREATE OR REPLACE TEMPORARY TABLE staging_table_SNOW LIKE SNOW_TRANSACTIONS;

-- ステージングテーブルにデータをロード
COPY INTO staging_table_SNOW
FROM @snow_flake_stock_price_transactions
FILE_FORMAT=(TYPE = CSV FIELD_DELIMITER=',',SKIP_HEADER=1)
PATTERN='.*\.csv';

/* マージコマンドを使用して本番テーブルにデータを追加または更新
 DATETIMEがキー列で重複がないので、一致してなければ追加する
 そうすることで、同一のデータが入らなくなる。 */
MERGE INTO SNOW_TRANSACTIONS AS target
USING staging_table_SNOW AS source
ON target.DATETIME = source.DATETIME
WHEN NOT MATCHED THEN INSERT (DATETIME,OPEN,HIGH,LOW,CLOSE,VOLUME,DIVIDENDS,STOCK_SPLITS)
VALUES (source.DATETIME,source.OPEN,source.HIGH,source.LOW,source.CLOSE,source.VOLUME,source.DIVIDENDS,source.STOCK_SPLITS);

以上です。参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?