BigQueryでDatasetのデータ容量サイズ確認と費用計算方法

BigQuery使えば使うほど素晴らしいサービスですね。
AWSのAthenaやAzureのCosmosも良いけど、これ書いた現時点ではまだまだBigQueryには敵わないと俺は思っています。
特にAthenaにおいてはデータを入れるのがS3経由とかややこしいと感じています。
ファイル分析など活用ポイントが違うのでそれぞれのサービスが善し悪しがありますが、BigQueryがDBのような形をしているので集計に置いて俺はこちらがしっくり来ます。

話し逸れましたが、BigQueryを使っていたら料金が気になりますよね。
料金は大きく分けて

  • ストレージ料金
  • クエリ料金

この二つで大半を占めることが多いです。
その中で、クエリ料金は「150万円を溶かしてしまった」とか話題になったこととかで注意する人が多いですね。
だけどストレージ料金もばかにならないので、今回はDataset別でデータ容量サイズ確認とそれをもって費用計算して、ストレージ料金を算出してみようと思っています。

とりあえずやってみよう

Datasetのデータ容量サイズ確認

BigQueryで下記のようにSQLを実行します。

SELECT SUM(size_bytes) / 1000000000 AS GBs
FROM [DatasetName.__TABLES__]

例えば、DatasetNameの名前が「test_abc」と言う名前だとすると、実行は下記のようになります。

SELECT SUM(size_bytes) / 1000000000 AS GBs
FROM [test_abc.__TABLES__]

そうすると指定Datasetが使っているGiga Byte数が下の画像のように表示されます。

「90日間にわたってテーブルが編集されていないテーブル」を分けてもう一度確認

データ容量サイズ確認を確認したいのであれば、上ので事足りますが、ストレージ料金を計算するにはこれでは足りません。
理由はストレージ料金の種類はアクティブ ストレージ長期保存二つあるためです。

長期保存は連続する 90 日間にわたってテーブルが編集されていない場合に適用される料金です。
ですので、集計も90日を境に別々に取る必要があります。
それを対応したのが下のSQL。

SELECT 
  CASE
   WHEN last_modified_time > TIMESTAMP_TO_MSEC(DATE_ADD(now(), -90, "DAY")) THEN false
   ELSE true
  END AS over90
  , SUM(size_bytes) / 1000000000 AS GBs 
FROM [DatasetName.__TABLES__]
GROUP BY over90

これを実行する時にDatasetNameを変えることをお忘れなく!
これを実行するとこのように表示されます。

  • false: 90日間にわたってテーブルが編集されていないテーブルのGiga Byte数
  • true: 90日間にわたってテーブルが編集されているテーブルのGiga Byte数

費用計算

費用計算は上から集計した値に料金を掛けて合計すれば良いです。

  • アクティブ ストレージ: false * アクティブ ストレージ料金
  • 長期保存: true * 長期保存料金

上で使って例で東京料金で計算すると、

  • アクティブ ストレージ: 102.094873402 * $0.023 = $2.35
  • 長期保存: 263.130585555 * $0.016 = $4.21

お疲れ様でした。