BigQueryのパーティション数上限 4000から10000への緩和…が簡単に適用できない場面について
BigQueryのパーティショニング
BigQueryはたいてい爆速でクエリ結果を返してくれるのでサボりがちな方もいるかもしれませんが、 テーブル自体を適切に管理することができればもっと効率的にクエリを走らせることができます。
「適切に管理」というところでの要素としては、
-
パーティショニング
-
クラスタリング
-
シャーディング
といったものが大きいです。
今回はその中の「パーティショニング」の話です。
その名の通り、テーブルを内部的には分割して保持してくれているものになります。
パーティション分割テーブルの概要の公式ドキュメント もご参照下さい。
また、 パーティショニングと混同されがちなシャーディングとの違い についても 「BigQueryのパーティショニングとシャーディングを改めて整理する」の記事 で整理していますのでご参照下さい。
パーティション数の上限とその緩和
パーティショニングを行うにあたっては、整数範囲、時間単位列、取り込み時間といった形でのパーティショニングが可能となっていますが、注意しなければならない点として作れるパーティション数の上限というものがあります。
もちろん上限は大きければ大きいほど自由度が高まってありがたいのですが、
BigQueryの2024年5月29日のリリースノート にある通り、
The maximum number of partitions per partitioned table limit has changed from 4,000 to 10,000.
ということで、 今年の5月からパーティション数の上限が4000から10000に緩和されました。
この変更がどれくらい大きいか…というと
日毎でパーティショニングをしていた場合(うるう年はいったん考えず1年365日として)
もともと 4000 / 365 = 10.96
ということで11年分くらいのデータしかパーティショニングできなかったのが、
2.5倍なのでざっくり27年強のデータをパーティショニングできるようになったということになります。
2024年時点でリアルタイムに更新されているデータとして、2000年以降全てのデータを問題無く日毎でパーティショニングできるくらい、と考えるとなかなかの余裕が生まれています。
BigQueryもリリースから時間が経ってきたというところでの配慮もあるのでしょうか。
パーティション数上限緩和を享受できないパターン
ということで、喜びつつもウチにはそんな大きなデータないしなあ…と思っていたところ、
最近ついに念願の(?)12年分くらいのデータを取り込む機会がありまして、
そこで早速日毎のパーティショニングを行えると喜びながらパーティション分割テーブルを作成するクエリを実行してみると
bigquery error: Too many partitions produced by query, allowed 4000, query produces at least 4254 partitions
というエラーが出て撃沈してしまいました…
4000が上限というようなエラーメッセージが出ていたので、
最初はリージョンでの制約とかかと思っていたのですがよく見てみると…
「クオータと制限」のページの「パーティション分割テーブル」の項目に下記の記載がありました。
1 つのジョブ オペレーション(クエリまたは読み込み)で処理できるパーティションの数は最大 4,000 です。BigQuery では、4,000 個を超えるパーティションを変更しようとするクエリまたは読み込みジョブは拒否されます。
今回は一括で整形を行う際にパーティショニングを行っていたので、クエリで4254のパーティションが生成されてしまって、それがNGだった… ということですね。。
対応としては、
-
一気にテーブルを変更するようなクエリはやめておくか
-
そこまでパーティショニングにこだわりがなければ、月単位でのパーティショニングとして割り切ってしまうか
ということになるかと思います。
ちなみに今回のケースでは、いったん月単位でのパーティショニングと割り切って対応することにしました。
またクエリコスト等を見て必要と判断した場合には別途対応を検討しようと思います。
5月のリリースを見たときには絶対試したいと思っていたのですが…ちょっと残念な結果になってしまいました。。
まとめ
今回はパーティション数の上限緩和について試してみようとしたけどクエリ処理数の上限に引っかかってしまった…という話でした。
あくまで2024年9月現在の情報ですので、今後のアップデート次第ではクエリで処理できるパーティション数の上限緩和もありうると思います。
パーティショニング自体はクラスタリングとあわせてぜひ取り入れておきたいものかと思いますので、クエリのコスト等から適切な管理を随時行うようにしていきたいですね。