GCPでは毎日のログなどを保存するときテーブル名に日付を入れてパーティショニングしたりするので、複数のテーブルをSELECTの対象にしたくなるときがあります。
「*」(ワイルドカード)でテーブル名を指定する
SELECT文に「*」を入れることで、その他の部分にマッチしたテーブル名を持つ複数のテーブルを横断して検索することができます。
例えば次のテーブル名でテーブルを作成します。
- sample_20181218
- sample_20181219
- sample_20181220
このテーブルに、次のデータを入れておきます。
テーブル | id | timestamp |
sample_20181218 | 1 | 2018-12-18 |
sample_20181219 | 1 | 2018-12-19 |
sample_20181220 | 1 | 2018-12-20 |
次のSELECT文を実行するとすべて対象に出来ます。
SELECT * FROM `xxxx.sample.sample_201812*`
結果。
3つのテーブルに登録されているデータを抽出することができました。
対象となるテーブルをさらに_TABLE_SUFFIXで絞り込む
横断検索できるのは便利ですが、対象テーブルが多くなりすぎるとデータ量が増えたり時間が掛かったりしてそれはそれで困ります。
そこで_TABLE_SUFFIX疑似列を用いると「*」でフィルタされたところからさらに絞り込むことが出来ます。
_TABLE_SUFFIX疑似列には、「*」でマッチした文字列が入ってきますので、それをWHERE句で判定します。
SELECT * FROM `xxxx.sample.sample_201812*` WHERE _TABLE_SUFFIX = '18' OR _TABLE_SUFFIX = '20'
とすれば、「sample_20181218」と「sample_20181220」が対象になります。
さらにここで注目してほしいのは、右上の処理バイト数です。
全体を指定したSELECT文は48 B、「18」と「20」を指定したSELECT文は32 Bとなっています。
この数値はBigQueryで検索対象となるデータサイズで料金に直結するところです。
つまり_TABLESUFFIXであらかじめフィルタリングできれば、料金も節約することができます。
参考:ワイルドカード テーブル