自称フルスタックエンジニアのぶろぐ。

pythonやreactや、gcpやawsなどなどについて書いていこうかと思います。

GCP BigQuery 応用編 ~制限について~

入門編はこちら murabo.hatenablog.com

制限

詳細はオフィシャルのこちらを参照してください。

気をつけるものをピックアップして記載します。

標準テーブル

  • 1 日あたりの最大テーブル オペレーション数 - 1,000

1テーブルに対して、
読み込みジョブコピージョブクエリジョブ
を組み合わせた合計数となります。

分割テーブル

分割テーブルとは、取り込んだ日、または指定した日付カラムを元に、デイリー毎にテーブルが分割されます。

4000日分まで保有することができる

ジョブ オペレーション(クエリまたは読み込み)ごとに対象にできるパーティションは最大 2,000 です。2,000 を超えるパーティションを対象とするクエリまたは読み込みジョブは、Google BigQuery で拒否されます。 (2000日分のテーブルを操作可能という意味)

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

のように連結させて同一テーブルのように扱うことが可能です。