*****
はじめに
こんにちは、こんばんは。
皆さんBigQuery、使っていますか?
BigQueryは言うまでもなくGCPのキラーサービスのひとつなのでもしかしたらこれまでDBとか触ってこなかったけどBigQueryから触ることになりましたって人は多いのかもしれません。(BigQueryがDBかどうかはさておきですが...笑)
そんな人からするとこんな記事もあるご時世ですし、「cloud破産」が恐怖ですよね...
(タイトルを掲示したかっただけで以下記事の著者さんも記事内の冒頭に注釈を付けていますが、この記事には料金を膨らませないようにするためのコツやポイントが書いてあるので全くもってネガティブな記事ではないです。)
今回の記事はそんな怯える人々に少しでも
「BigQueryは怖くない」
「よし、BigQureyを使ってみようかな」
と思ってもらえるように書いていこうと思います!
*****
BigQueryの課金体系
まず節約、コストカットを行うにあったって利用しているサービスのどこ部分にお金がかかっているのかを理解するべきです。
基本的にBigQueryでは
- ストレージ($0.020 per GB)
- クエリ($5.00 per TB)
- ストリーミングインサート($0.010 per 200 MB)
という課金が発生するようになっています。(料金は米国マルチリージョンでのもの)
今回はこの中から「クエリ」のコストカットや節約についてお話します!
*****
クエリ料金の抑え方
- 「SELECT *」は控えよう
- プレビューオプションを使おう
- 実行前に見積もりを計算しよう
今回はパート①ということで、数ある「クエリで実質お金を稼ぐ方法」のうちから簡単にできるものを紹介しようと思います。
クエリのコストを抑える方法は数あるのですが、1つ覚えておいてもらいたいことがあります。それはBigQueryにおいてクエリ料金はどのように計算されているのかということです。このことを知っておくことは後々紹介する方法を体系的に理解することにつながるかと思うので知っておくべきだと思います!
BigQueryにおいてはクエリの料金は「クエリにおいて読み込んだデータサイズ」によって決まるのです。
察しの良い方はもう気がついていると思うのですが、これは直接的に上に挙げた方法の一番最初のものに繋がっています!
それでは1つ目から紹介していきます!
*****
「SELECT * 」は控えよう
最初のこちらが一番シンプルで最も簡単にコストを抑えられる方法です!(もう当然の如く行っている人も多いのではないかなと思います。)
先程述べたとおりクエリにおける料金は「クエリにおいて読み込んだデータサイズ」によって決まっているので、もし「SELECT *」を使ってしまうとそのデータテーブルをすべて読み込んでしまうのでフルでお金がかかってしまいますね。
ベストプラクティスとしては
「SELECTで必要なカラム名を指定する」
ことかなと思います。
まぁただ、全カラム必要な場合ももちろんあると思うのでそこはケースバイケースですね。
その時その時に応じて自分の目的とクエリを照らし合わせて必要最低限のSELECTを書くように心がけましょう!!
*****
プレビューオプションを使おう
2つ目はプレビューオプションを使おうというものです。
そもそもプレビューオプションとはなんなのでしょうか...?
BigQueryではデータを探索やプレビューするための機能が「GUI」「CLI」
「API」にそれぞれ用意されています。
- 「GUI」ではgoogle cloud consoleにおいてプレビュータブを選択するとデータをサンプリングできるというものです。
- 「CUI」ではbq head コマンドを使用することでプレビューができます。またその行数の指定も行えます。
- 「API」では tabledata.list を使用して指定した行のセットからテーブルデータを取得できます。
これらをプレビューオプションと呼んでいます。
ではなぜプレビューオプションを使うことが推進されているのでしょうか?
それは単純な話でプレビューオプションを使用してテーブルを探索する分には課金は発生しないからです。
そのため、簡単にテーブルデータを確認したり探索したりしたいときにはクエリを書かずともプレビューオプションを使用することで目的を達成できるというわけです!
*****
実行前に見積もりを計算しよう
今回最後に紹介するのは見積もりをしようということです!
見積もりを出すステップを簡単に説明すると
- クエリが読み込むバイト数を出す
- バイト数をもとに料金計算
となります。
このバイト数を出す方法が2つあります。
まず1つ目がgoogle coud console上で行うものです。
これは特になにかするわけではないのですが、console上でクエリを書くとこの様になるかと思います。
写真内の赤枠内にデータサイズが表示されているのが確認できますね!
これがクエリによって読み込まれるデータサイズです...!
さて、1つ目はGUI上でクエリを叩く際の話でした。
ではCUIでクエリを実行する際には実行前にそのクエリがどのくらいのバイト数を読み込むのかを確認はできないのでしょうか?
答えはできます。
それが2つ目の方法です。
2つ目はdry runを使う方法です。こちらは上記で記述したとおりCUIにおいて自分のクエリがどこくらいのデータサイズを読み込むのかを知るためのものです。
使用方法としてはコマンドにオプションとしてつけるのですが、デフォルトではそのまま確認できず実行されてしまうので、CUIでクエリを叩く際にはdry runをしっかりつけることを癖付けておきましょう。
書式は以下の通りです
bq query \
--dry_run \
'SELECT
year,
startTime,
FROM
`bigquery-public-data.baseball.games_post_wide`
LIMIT
1000'
「--dry_run」でオプション設定しているがわかるかと思います!
また、dry run に関しては他にも「API」「Go」 「Python」から行われるクエリにも同じ様に使用できます。
さぁ、上記2つの方法によってクエリの実行によって読み込まれるデータサイズは確認できるようになったかと思います。
それでは次にステップ2の説明をしようと思います!
ここでは以下のツールを使用します。
注意点としては、1TB以下のクエリに関してはBigQueryのオンデマンド処理が月々1TBまでは無料になるため、見積もりが $0 になるということです。
*****
まとめ
今回は「【GCP BigQuery】クエリの書き方で実質お金を稼ぐ 〜パート①〜」と題して3つのクエリ代を節約する方法について記述させて頂きました!
(「クエリで実質お金を稼ぐ方法」と題しておいて2つ目と3つ目はクエリ書いてないとかは触れちゃいけないところです...)
それでは以下が今回のポイントのまとめです!
- SELECTで必要なカラム名を指定する
- クエリを書く必要のないときはプレビューオプションを使用する
- 実行前にクエリ代を見積もる
以上の点を踏まえて素敵なBigQueryライフを!!
それではまたパート②で〜
参考
https://cloud.google.com/bigquery/docs/best-practices-costs?hl=ja