BigQueryではマルチステートメントクエリの中で一時テーブルを作成することで、一時テーブルの結果を24時間、一時的に保管することができます。これにより、一時テーブルを生成してしまえば、再度、結果テーブルを利用したい場合は、一時テーブルの結果にアクセスすることで結果テーブルを生成するコストを削減することができます。
マルチステートメントクエリの一時テーブルを作成
セミコロン(;)で区切られたステートメントをマルチステートメントクエリと呼びますが、その中で一時テーブルを作成することで、その一時テーブルの結果テーブルが一時的に保管されるため、その結果テーブルに後続クエリからアクセスすることが可能になります。
実務でよく使われる一時テーブルの使い方としては、クエリの先頭でベーステーブルとなる一時テーブルを一旦作成してしまうことで、後続クエリから、その一時テーブルを使いまわす形で検証を進めるという方法がよく取られます。
この利点としては、同じことをCTEで実行してしまうと、クエリの実行ごとにベーステーブルの生成が行われてしまうため、ベーステーブルのクエリ抽出量が多ければ多いほどコストが嵩んでしまうことになります。CTEを一時テーブルに置き換えることで、ベーステーブルの生成を1回で済ますことが可能になるため、その分、クエリ抽出料金の削減につなげることができます。
CREATE TEMP TABLEステートメントで一時テーブルを作成
CREATE TEMP TABLE ステートメントを使用して一時テーブルを作成しますが、ここで公式ヘルプに記載がない重要な点として考慮しなければいけない点がいくつかあります。それは一時テーブルを作成するにあたり、一時テーブルが作成されていない場合には、一時テーブルを作成する必要があり、その構文は公式ヘルプには記載がありませんが、その処理を構文に含める必要があります。それが、CREATE TEMP TABLE IF NOT EXISTS 構文になります。
CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20260501');
CREATE TEMP FUNCTION date_to() RETURNS STRING AS ('20260530');
CREATE TEMP TABLE IF NOT EXISTS tmp_tbl_01 AS (
SELECT
*
FROM
`<project>.<dataset>.events_*`
WHERE
_TABLE_SUFFIX BETWEEN date_from() AND date_to()
);
SELECT
*
FROM
tmp_tbl_01BigQueryのセッションモード
BigQueryではセッションの概念が存在しており、通常セッションを明示的にONにしていなければセッションはOFFのままマルチステートメントクエリが実行されます。つまり、セッションがOFFのまま、一時テーブルを作成してもマルチステートメントクエリの一連の処理が完了したと同時に、セッションが切れてしまっているため、CREATE TEMP TABLE文で使用した識別子(tmp_tbl_01)から、アクセスすることができず、本来の目的であるベーステーブルの再利用ができないという状態になります。これだと、意味を成さないため、一時テーブルを作成する際は、必ずBigQueryのセッションをオンにした状態で一時テーブルを作成する必要があります。
マルチステートメント クエリとセッションの違い
概念上の話になるのでイメージが付きにくいかと思いますが、セッションモードがOFFのままでもマルチステートメントクエリは機能します。では、セッションのONとOFFの違いによって何が変わるのかといえば、作成した変数や一時テーブルが「いつまで生き残るか」のスコープの定義を変更するといった役割になります。
正確にいえば、セッションがOFFの状態で一時テーブルを作成しても、キャッシュされたクエリ結果は24時間保管され、明示的にセッションIDを利用することは可能ですが、後続クエリからの活用が難しくなります。ですが、セッションをONにすることで、マルチステートメントクエリの中で実行された結果は、セッションというスコープの中で保管されるため、マルチステートメントクエリの処理が終了しても、変数や一時テーブルはそのセッションの中で生き残ることになります。その結果、再度のCREATE TEMP TABLE 文を発行した際には、一時テーブルが存在するため、一時テーブルを再クリエイトする必要がなくなり、後続クエリですでに存在する一時テーブルにアクセスすることが可能になるわけです。
『Googleアナリティクス4 完全入門』 書籍販売中!