「便利」と「最適」は違う。本番運用ではGCS経由が正解。

結論

BigQueryへのデータ投入は、GCS経由が本番運用の正解。

直接INSERTの問題

問題1:ストリーミングINSERTは有料

INSERT INTO my_table VALUES (...)

これ、1行あたり課金されます。

1GBあたり約$0.05。1000万行なら数千円。

問題2:大量データで不安定

100万行を一気にINSERTすると、タイムアウトやエラーが発生しやすい。

問題3:リトライが面倒

途中で失敗したとき、「どこまで入ったか」が分かりにくい。

GCS経由のメリット

メリット1:無料

GCSからBigQueryへのロードは無料

GCSにファイルを置く → BigQueryにロード

ストリーミングINSERTより圧倒的に安い。

メリット2:大量データも安定

100万行でも1000万行でも、同じように安定して動作。

メリット3:リトライが容易

失敗しても、ファイルをそのまま再ロードすればOK。

メリット4:履歴が残る

GCSにファイルが残るので、「いつ、何を投入したか」の履歴になる。

具体的な方法

Step 1:CSVまたはJSONでGCSにアップロード

gsutil cp data.csv gs://my-bucket/data/

Step 2:BigQueryにロード

bq load \
  --source_format=CSV \
  my_dataset.my_table \
  gs://my-bucket/data/data.csv

自動化するなら

Cloud Functionsで「GCSにファイルが置かれたら自動でロード」を設定。

いつ直接INSERTを使うか

リアルタイム性が必要なとき

「1秒以内にデータを反映したい」場合は、ストリーミングINSERT。

でも、**本当にリアルタイムが必要か?**を再考すべき。

多くの場合、「1時間ごと」や「1日ごと」で十分。

コスト比較

方法100万行のコスト
ストリーミングINSERT約500円
GCS経由ロード0円

年間で考えると、数万円〜数十万円の差

まとめ

「便利」と「最適」は違う。

本番運用では、GCS経由でのデータ投入が正解です。