Help us understand the problem. What is going on with this article?

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

More than 5 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編に続く(と思う)

satoru_mag
社内なんでも屋さん。 BigQueryとGoogleAnalytics360が大好物。 最近はがんばってpython勉強中。 GoogleDevelopersExpert(GCP)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした