BigQueryのクラスタ使ってみた

BigQueryのパーティション指定はしたことはあるけど
クラスター使ったことなかったので使ってみた

クラスターテーブル作成

現在、パーティション分割テーブル以外のテーブルではクラスタリングはサポートされていません。

と公式にあるので、dateフィールドをパーティションにして
クラスターにしたいフィールドを指定する
(最大4つまで指定できるらしい)

CREATE OR REPLACE TABLE
 `[dest_project_id].[dest_dataset].[dest_table]`
PARTITION BY
 processing_date
CLUSTER BY
 store_code, 
 jan_code AS
SELECT
 *
FROM
 `[origin_project_id].[origin_dataset].[origin_table]`

検証してみる

まずはパーティションがちゃんと効いてるかみてみる

スクリーンショット 2020-07-16 21.11.21

何にも指定しないと45.8GBもかかる!

パーティションのフィールドを指定してみる
スクリーンショット 2020-07-16 21.18.07

60.4MBまで下がった!パーティションすごい!

クラスターの効果を見てみる
スクリーンショット 2020-07-16 21.12.02

81.4MB。むむ。むしろあがっとるやないかい🤯
と思ったが、実行してみると39.5MB。
クラスターの効果は実行するまでわからない説🧐

フィールドを指定する順番

公式によるとWHEREで指定する順番は
クラスターで指定した順序じゃないといけないらしい。ので検証してみる!

スクリーンショット 2020-07-16 22.00.42

store_code, jan_codeの順でクラスタ指定したので
逆順でWHERE句指定したら、効かなくなるんでしょう😎
と思いきや効いてる。わからん👶

公式のサンプル見てると
パーティションフィールド指定してない。。それでやってみる

スクリーンショット 2020-07-16 21.34.20

70.4GBだけど20.2GBまで下がる。クラスタ効いておる

スクリーンショット 2020-07-16 21.32.24

2つ目に指定したjan_codeで指定してみると
45.8GB->45.8GBと全く減ってない。クラスタ効いてない!そういうことか

JOINでも効いてくれる

スクリーンショット 2020-07-16 22.23.35

クラスタの最初に指定したstore_codeをJOINの条件に指定してみると
24.5GBが7.1GBに!
クラスタはパーティションと一緒に作成する必要がるが、クラスタ単体でも有効な効果が出てくれる!素敵!

スクリーンショット 2020-07-16 22.25.51

試しにクラスタ2つ目のjan_codeでJOINすると効いてない
やはりクラスタで指定する順序は重要なようだ

まとめ

ということで、クラスタ思ってたより素敵!
別にお金かからないし、これからはちゃんとセットしよう

この記事が気に入ったらサポートをしてみませんか?