Google BigQueryはクエリで処理したデータ量だけ課金される。テーブルが大きくなれば大きくなるほど課金されてしまうのである。これではログを1つのテーブルに大量に挿入していると困ったことになってしまうように見える。
Google BigQueryでは、このような追記型のテーブルに対して、テーブルのサブセットを利用することで、クエリにかかるコストを削減できるTable Decoratorという機能がある。
この記事は上記記事の抄訳となる。
Table Decoratorを利用する
通常、BigQueryにはクエリ実行時に全てのカラムをスキャンする。Table Decoratorを使用することで、データのサブセットに対し、費用効果の高いクエリを実行できる。Table Decoratorはコピー、エクスポート、リスト出力など、テーブルを読み込む全ての処理で使用できる。
Table Decoratorはms(ミリセカンド)単位で時刻を指定し、テーブルのサブセットを使用できる。時刻の指定には、現在時刻からの相対指定と、絶対指定ができる。例えば、-3600000
は現在時刻より1時間前を示す。3600000
はunix epoch(1970年1月1日0時0分)より1時間後を示す。
Snapshot decorators
Syntax
@<time>
<time>
時点のテーブルのスナップショットを示す。<time>
には、unix epochからの経過時刻をms(ミリセカンド)で指定する。<time>
は過去7日以内かつ、テーブル作成時刻よりも大きくなければならない。@0は特別なケースで、最も古いテーブルのスナップショットを参照する。これは、7日前、もしくは、テーブルが作成されて7日以前であればテーブル作成時刻を示す。
Examples
相対指定の場合
1時間前のテーブルのスナップショットを取得する場合:
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@-3600000]
絶対指定の場合
1時間前の時刻は次のクエリで取得できる:
SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
その後、次のクエリのを置き換えて実行する:
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@<time>]
Range decorators
Syntax
@<time1>-<time2>
<time1>
と<time2>
の間に追加されたテーブルデータを参照する。<time1>
、および<time2>
はunix epochからのms(ミリセカンド)で指定する。<time1>
と<time2>
は過去7日以内でなければならない。<time2>
は省略でき、省略した場合は現在時刻になる。
Example
1時間前から30分前までに追加されたデータを取得する場合:
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@-3600000--1800000]
絶対値で指定する場合:
<time1>
と<time2>
は前述したクエリで取得できる。
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@<time1>-<time2>]