GCP BigQuery 応用編 ~制限について~
入門編はこちら murabo.hatenablog.com
制限
詳細はオフィシャルのこちらを参照してください。
気をつけるものをピックアップして記載します。
標準テーブル
- 1 日あたりの最大テーブル オペレーション数 - 1,000
1テーブルに対して、
読み込みジョブ、コピージョブ、クエリジョブ
を組み合わせた合計数となります。
分割テーブル
分割テーブルとは、取り込んだ日、または指定した日付カラムを元に、デイリー毎にテーブルが分割されます。
- 分割テーブルあたりの最大パーティション数 - 4,000
4000日分まで保有することができる
- 1 つのジョブで変更される最大パーティション数 - 2,000
ジョブ オペレーション(クエリまたは読み込み)ごとに対象にできるパーティションは最大 2,000 です。2,000 を超えるパーティションを対象とするクエリまたは読み込みジョブは、Google BigQuery で拒否されます。 (2000日分のテーブルを操作可能という意味)
- テーブルごとの 1 日あたりの最大パーティション変更数 - 5,000
1テーブル(1日分のテーブル)に対して、5000回まで追加、削除、更新、マージが可能です。
※ただし、ストリーミング挿入はこの割り当てに影響しません
データ操作言語のステートメント
- UPDATE、DELETE、および MERGE の各ステートメントを組み合わせた実行数の 1 日あたりテーブルあたり最大値 - 200
- UPDATE、DELETE、および MERGE の各ステートメントを組み合わせた実行数の 1 日あたりプロジェクトあたり最大値 - 10,000
- INSERT ステートメント実行数の 1 日あたりテーブルあたり最大値 - 1,000
制限に対するベストプラクティス
上記に記載したとおり、更新を加える回数制限が厳しいため、用途によっては実現できない場面が発生します。
これらの制限を回避するためには、テーブル事態を分けることで回数制限を受けにくくすることが可能です。
例えば、
1.ログテーブルをBigQueryで実現したい場合、 - Log1テーブル - Log2テーブル - Log3テーブル などと、同じ構造のテーブルを作成し、userIDなどを元に、logの向き先を制御する。
2.ログテーブルをBigQueryで実現したい場合、 - 九州Log1テーブル - 四国Log2テーブル - 北海道Log3テーブル などと、同じ構造のテーブルを作成し、アクセスや登録エリアなどを元に、logの向き先を制御する。
これらの分割したテーブルは、
select * from logA union all select * from logB
のように連結させて同一テーブルのように扱うことが可能です。