BigQuery の課金仕様と注意点をまとめてみた（2015-07 時点）

最初は安く収まっていた BigQuery の費用もだんだん膨らんできた :cry: ので、自分（社内）用にまとめたものです

- 広告事業（アドネットワーク）のログを BigQuery に入れているので、それなりにデータ量も増えてきて、こういうことも考えていかないといけなくなってきました

# どの操作にお金がかかるのか

1. データを保存しておく
2. データを Streaming Insert（≒ 追加）する
3. データを走査して取得する
4. クエリを発行する

### データの保存

`$0.020 per GB, per month`

- 1 TB を 1 ヶ月保持すると、$20 かかる

### データの Streaming Insert

`$0.01 per 100,000 rows until August 12, 2015. After August 12, 2015, $0.01 per 200 MB, with individual rows calculated using a 1 KB minimum size.`

- いまのところ、10 万行で $0.01 かかる
 - 1000 万行書いて $1
 - 100 億行書いて $1000
- 補足：load 方式であれば、無料

### データの取得

`$5 per TB`

- 1 TB 走査すると $5 かかる

### クエリの発行

ドキュメントからは確認できなかったが、明細には載っている

### 参考

[Pricing - BigQuery — Google Cloud Platform](https://cloud.google.com/bigquery/pricing)

# それと明細の対応はどうなってるのか

データ操作ごとの課金体系に照らすと

### BigQuery ストレージ

データの保存に当たる
1 ヶ月平均 k TB 保持して、$20 * k かかってる

### BigQuery Row Insert

Streaming Insert に当たる
m 億行を挿入して、$10 * m かかってる

### BigQuery 分析(Analysis)

データの取得に当たる
n TB 走査して、$5 * n かかってる

### カスタム検索 クエリ(Custom Search Queries)

2918 回発行して $15 かかってる

|	日付	|	内容	|	料金 ($)	|
|	 --- 	|	 --- 	|	 --- 	|	 --- 	|	 --- 	|
|	2015/mm/01 - 2015/mm/26	|	Support Silver-level support cost: 150 Currency units（プロジェクト: MTBurn）	|	$150.00 	|
|	2015/mm/01 - 2015/mm/30	|	カスタム検索 クエリ: 2918 Counts（プロジェクト: MTBurn）	|	$14.59 	|
|	2015/mm/01 - 2015/mm/30	|	BigQuery ストレージ: k*1000 Gibibyte-months（プロジェクト: MTBurn）	|	$20*k 	|
|	2015/mm/01 - 2015/mm/30	|	BigQuery 分析: m Tebibytes（プロジェクト: MTBurn）	|	$5*m 	|
|	2015/mm/01 - 2015/mm/30	|	BigQuery Row Insert: n * 100000000 Counts（プロジェクト: MTBurn）	|	$10*n 	||
|		|	「2015/mm/01 - 2015/mm/30の合計」	|	`$150 + $15 + $20*k + $5*m + $10*n` 	|
|		|		|		|

注意) 数字はぼかしました

# 補足

### BigQuery ストレージ

GCS よりも安いので、purge はまだ検討段階にはない状態です

### BigQuery Row Insert

老婆心ですが、今から（& 今でも） BigQuery を導入する場合は、まずは Streaming Insert ではなく Load 方式を検討するのが良いと思います

- `BigQuery Row Insert` にかかる費用は挿入行が増えてくればそれなりのお値段にはなりますし、直近の障害も Streaming Insert に偏っているように思います
- ただ、[kaizenplatform/fluent-plugin-bigquery](https://github.com/kaizenplatform/fluent-plugin-bigquery) を使った fluentd からの Streaming Insert はすごく手軽なので、どちらも検討余地があります

### BigQuery 分析(Analysis)

クエリを発行する際には、テーブルデコレータをかならず使いましょう（直近 7 日前までの走査範囲で良ければ）

- `bq query --dry_run "SELECT * FROM table"` して、走査バイト数の予測値（`running this query will process *** bytes of data`） を確認しましょう
 - byte を (1024 / 1024 / 1024 / 1024) で割って、Tebibytes に直して $5 をかけます
 - 合わせて、SELECT 文に WHERE とか LIMIT をつけても走査バイト数が減ったりはしないことも確認できます
 - ドライランは無料なのでいくらでも発行できます
- テーブルデコレータを使うと、数千分の一とかまで費用を下げることもできます
 - [GoogleBigQuery - Table Decoratorを使って処理するレコード数を削減する - Qiita](http://qiita.com/harukasan/items/9c067ebb919923194ee8)
- ただ、意外とアドホックなクエリを書くときには面倒臭いので、直感的に使えるツールを作ってみたのでお試しください  :bowtie: :moneybag:
 - [CLI tool to easily Decorate BigQuery table name](https://github.com/yoheimuta/dbq)
 - [Go - dbq（CLI tool to easily Decorate BigQuery table name）を作ってみた - Qiita](http://qiita.com/yoheimuta/items/bedb9080c9601cffa093)

根本的には、テーブルは日単位とか適切な粒度で分割しないと費用は膨らむ一方です

- 一回のクエリ発行に数千 ~ 数万円になってしまいます

`SELECT *` の代わりに、カラムを明示的に指定することもマストといえます

- [Amazon.co.jp： Google BigQuery: Jordan Tigani, Siddartha Naidu, Sky株式会社 玉川 竜司: 本](http://www.amazon.co.jp/Google-BigQuery-Jordan-Tigani/dp/487311716X) には、非推奨（走査バイト数がかさむため）でもともとサポートしていなかったが、要望が多いので追加された機能と書かれてます
- 仮に一回のクエリ発行に数千円かかっても、数百円とかまで費用が下がることは十分あります

### Support Plan

`Support Silver-level` は $150 かかりますが、Streaming Insert を使っている場合は入ることをおすすめします

- Streaming Insert はまだ不安定なので、こちらから問題に気づいて先方の障害対応に発展することがありました
- 障害復旧のお知らせが来たあと、他のユーザーでは解消していることが、一部ユーザーには解消していないケースもあるので、そういう際にも対応してもらえます
- Google エバンジェリストの佐藤さん（@kazunori279）に紹介してもらいましたが、入って良かったです

[サポート サービス — Google Cloud Platform](https://cloud.google.com/support/?hl=ja)