「便利」と「最適」は違う。本番運用では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経由でのデータ投入が正解です。