GoogleCloudPlatform
GoogleBigQuery
bigquery

BigQueryの課金について考えた(UNION編)

More than 3 years have passed since last update.


ということで後編

すいません。時間が空いちゃいました。

ちなみに前編を書いた後に、社内では『select *』禁止令を出しました。w

ということで後編。JOINやUNIONについてやってみましょう。

これ書いている最中にJOIN書くとすげぇ長くなるわ!ということでUNION編とJOIN編に分けさせて頂きます。

実はそもそもこれを書こうと思ったきっかけは同一テーブルのUNIONでコストが変わらないことでした。どういうこと?って人も居ると思いますが、まぁやってみましょう。


UNION編


同一テーブルでUNION(同じところをWHERE句で指定)

まずはこんな容量のテーブルです。商品マスタが入っています。


Table Size 2.24GB

Number of Rows 8,477,398


あんまりコストをかけると怒られる(?)のでUNIONで出す値は商品コードだけにします。

まずはwhere句を付けないでUNIONもやらないでやるとどのぐらいか。


Query complete (17.4s elapsed, 65.5 MB processed)


まぁ、こんなもんです。じゃ、商品名に『限定』という文字が入っているものを抜き出してみましょう。


Query complete (2.4s elapsed, 268 MB processed)


こんな結果でした。

じゃ、文字列のところだけ『初回』に変更したSQLをUNIONしてみましょう。

これで『限定』っていう文字列が入ったマスタと『初回』って入ったマスタを抽出できます。

(※もちろんダブることもあります。それはそれで良しとします)


Query complete (5.9s elapsed, 268 MB processed)


ほいきた!UNIONって2回SQLを回しているのかと思いきや、どうやらそうじゃないみたい。

これが始まりだったわけですよ。『時間は倍かかってるじゃん!』というツッコみもありそうですが、時間なんていつも変わるので気にしたら負けです。


同一テーブルでUNION(違うところをWHERE句で指定)

つーことで、おまけ。

先ほどはWHERE句のところで同じカラムを指定しました。じゃ、ちがうところを指定してみましょう。

商品名を『初回』としましたが、カテゴリが『書籍』のものだけを抜き出します。


Query complete (8.4s elapsed, 126 MB processed)


じゃ、UNIONしてみましょう。


Query complete (16.4s elapsed, 329 MB processed)


足し算されましたね。見るところが違えば足し算されるってことですね。

至極まっとうなお答えをありがとうございました。


違うテーブルをUNION

じゃ、違うテーブルをUNIONしてみましょうか。

先ほど使った商品マスタのテーブルに以下のような商品コードを持ったテーブルを使ってみます。


Table Size 19.4GB

Number of Rows 45,063,406


同様に商品名に『初回』と入ったレコードを単独でUNION無しで抜き出してみましょう。


Query complete (7.7s elapsed, 1.40 GB processed)


レコード数が多いのでこうなりますわな。じゃ、さっきの商品マスタのテーブルとUNIONしてみましょう。


Query complete (11.6s elapsed, 1.66 GB processed)


こちらもきれいに足し算されました。


UNIONまとめ

①同一テーブルで同一カラムを指定したSQLをUNIONした場合は単独でやるのとコスト一緒

②同一テーブルでも違うカラムを指定したSQLをUNIONした場合は足し算

③違うテーブルをUNIONした場合は足し算

特に①は案外使えるかなぁと。たくさんの文字列をセットして、それぞれにヒットする商品を取ってきたいときにグルグル何回も回すのではなく、UNIONでくっつけた方がさらにコスト激安!ってことです。

Googleさんがこれを見て『あ、それも課金しなきゃですね!てへぺろ』ってのはナシでお願いしたいところです。

JOIN編に続く(と思う)