テーブル分割

bigqueryは他のdwhと同じく、基本フルスキャンになる。bigqueryはデータの処理量によって料金が変わる従量課金である。つまり、フルスキャンである以上、where句で絞り込んでも、テーブルの行数分処理が発生することになる。テーブルの行数が課金額に影響するため、予めテーブルを日付単位で分割しておき、条件に応じてUNIONするというのが一般的な使い方となる。これはMySQLで言うところのパーテーショニングの機能を手動で実現するのと同じである。また、dwhは基本的にupdateができないので、drop table + insert into select が基本となる。そのため、メンテナンスのためにもテーブルを分割しておくことは重要である。ちなみにredshiftにおいてもテーブル分割を使うことは変わりがなく重要である。商用dwhはパーテーショニング機能がついていて、ユーザーがテーブル分割を意識する必要はない。

SELECT 
  count(*) 
FROM 
 (
  TABLE_DATE_RANGE(
    dataschema.table_,
    TIMESTAMP('1970-01-01'),
    TIMESTAMP('2037-12-31')
 )    

タイムスタンプ型の最小値と最大値を指定してすべての日毎のテーブルを指定しようとするとエラーが発生する。TABLE_DATE_RANGEでは一年分しか設定できないようだ。