BigQuery の挿入方法を比較:CData BigQuery ドライバーによるストリーミング、DML、バルクロードの使い分け
Google BigQuery は、大量のデータを高いパフォーマンスとスケーラビリティで保存・分析するために設計されたクラウドデータウェアハウスです。CData BigQuery ドライバーは、データ統合のニーズに応じて BigQuery にデータをロードするための効率的な挿入方法として、ストリーミング、DML、バルクロードの3つを提供しています。
この記事では、これら3つの方法のパフォーマンス、コスト、更新タイミングを比較し、データワークフローに最適なアプローチを選択できるようにします。
それでは、早速見ていきましょう。
各挿入方法について
ストリーミング挿入
ストリーミング挿入は、個々の行をリアルタイムで BigQuery に送信し、数秒以内にデータがクエリ可能になります。リアルタイム分析、ライブダッシュボード、IoT テレメトリに最適です。
ストリーミングはほぼ即時のデータ利用を提供しますが、コストが高くなります。また、DML 操作(UPDATE、DELETE)は挿入後最大30分間制限されます。
メリット: 即時アクセス可能。リアルタイム分析に最適。
デメリット: コストが高い。一時的な更新制限あり。
最新のデータをすぐに利用する必要がある場合は、ストリーミングを使用してください。
ストリーミングは tabledata.insertAll メソッドを使用します。 詳細はこちらのドキュメントをご覧ください: https://cloud.google.com/bigquery/docs/reference/rest/v2/tabledata/insertAll
DML
DML(Data Manipulation Language)を使用すると、BigQuery で SQL を使ってレコードの挿入、更新、削除ができます。 トランザクションの整合性を提供し、レコードは完全に挿入されるか、まったく挿入されないかのいずれかになります。
DML は、正確性が重要な小規模な更新に最適です。 データはすぐに利用可能になりますが、大規模なデータセットではパフォーマンスが低下し、コストが高くなります。
メリット: 即時利用可能。アトミック操作。SQL ベースの柔軟性。
デメリット: 大規模では低速でコスト高。スロット消費あり。
厳密なデータ整合性が必要な小規模で重要な更新には、DML を使用してください。
DML の詳細はこちらをご覧ください: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-manipulation-language
バルクロード
バルクロードは、Cloud Storage やその他のソースから大規模なデータセットを BigQuery に取り込みます。CSV、JSON、Avro、Parquet などの形式をサポートしています。
非常にコスト効率が高く、バッチ操作に最適化されていますが、データはロードジョブが完了した後にのみクエリ可能になります。
リアルタイムアクセスが不要な定期的な ETL ジョブ、履歴データのインポート、大規模なデータセットの移行に最適です。
メリット: 非常にコスト効率が高い。大量データに対応。
デメリット: 利用可能になるまで遅延あり。事前にファイルのステージングが必要。
バルクロードの詳細はこちらをご覧ください: https://cloud.google.com/bigquery/docs/batch-loading-data
挿入方法の比較
以下は BigQuery の挿入方法の比較です。評価が低いからといって、その方法が不適切というわけではありません。他の方法と比較した相対的なパフォーマンスを示しているだけです。実際のパフォーマンスとコストは、具体的なユースケースによって異なります。
| 挿入方法 | パフォーマンス | 更新までの時間 | コスト | 正確性 |
|---|---|---|---|---|
| ストリーミング | 非常に良い | 低い | 高い | 普通 |
| DML | 低い | 非常に良い | 普通 | 非常に高い |
| バルクロード | 普通 | 普通 | 非常に低い | 普通 |
補足:
- ストリーミング挿入: リアルタイムのデータ利用が重要な場合に最適です。パフォーマンスは高いですが、コストも高く、一部の更新制限があります。
- DML: 完全なトランザクション整合性が必要な小規模で重要な更新に最適です。即時利用可能ですが、大規模なロードには効率的ではありません。
- バルクロード: 最もコスト効率が高く、大規模なデータ転送に適しています。データがクエリ可能になるまで多少の遅延があります。
CData BigQuery ドライバーでの挿入方法
CData は、JDBC、ODBC、ADO.NET、Excel 向けの強力な BigQuery ドライバーを提供しており、Google BigQuery へのシームレスな接続を実現します。BI、分析、ETL ワークフロー、カスタムアプリケーションとの間で、ライブ BigQuery データを簡単に統合できます。

それでは、CData JDBC ドライバーを使用して、ストリーミング、DML、バルクロードの各方法で BigQuery にデータを挿入してみましょう。
こちらからドライバーをダウンロードして、一緒に進めてください。
JDBC ドライバーでの挿入方法の指定
CData BigQuery ドライバーでは、InsertStrategy 接続文字列プロパティを使用してデータの挿入方法を制御できます。以下のいずれかを選択できます:
| 挿入方法 | パラメータ |
|---|---|
| ストリーミング挿入 | streaming |
| DML 挿入 | dml |
| バルクロード | batch |
デフォルトでは、ドライバーは InsertStrategy=streaming でストリーミング挿入を使用します。 方法を切り替えるには、接続文字列に InsertStrategy オプションを追加するだけです:
jdbc:googlebigquery:InitiateOAuth=GETANDREFRESH;DatasetId=demo;ProjectID=test; InsertStrategy=dml
ストリーミング挿入の場合
接続文字列に InsertStrategy=streaming を指定して接続し、以下の SQL クエリを実行します:
INSERT INTO [account-wk] (Id, Name) VALUES (10, 'StreamingTest1'), (20, 'StreamingTest2'), (30, 'StreamingTest3');
ドライバーが insertAll API メソッドを呼び出し、リクエストボディにレコードを JSON として送信していることがわかります。

DML 挿入の場合
InsertStrategy=dml で接続し、ストリーミングと同じ挿入を異なるレコードで実行します:
INSERT INTO [account-wk] (Id, Name) VALUES
(10, 'DMLTest1'),
(20, 'DMLTest2'),
(30, 'DMLTest3');
今回は、queries メソッドを呼び出してレコードを JSON で設定する代わりに、INSERT 文として直接送信します。

バルクロードの場合
接続文字列に InsertStrategy=batch を指定して接続し、以下の SQL クエリを実行します:
INSERT INTO [account-wk] (Id, Name) VALUES (10, 'BulkTest1'), (20, 'BulkTest2'), (30, 'BulkTest3');
ログを見ると、API アップロードがトリガーされていることがわかります。少量のデータでは明らかではないかもしれませんが、すべてのレコードが1回のリクエストでまとめて送信されます。

パフォーマンス比較
テストでは以下の10カラムのデータを使用し、それぞれ100、500、5000、10000行のパフォーマンスを測定しました。
挿入文の例:
INSERT INTO customer_data (id, first_name, last_name, email, phone, address, city, state, zip, country) VALUES
(9999, 'John', 'Doe', '[email protected]', '555-1234', '123 Elm St', 'Somewhere', 'CA', '90210', 'USA');
CData BigQuery JDBC ドライバーを使用した各挿入方法の結果は以下のとおりです:
| 挿入方法 | 100行 | 500行 | 5,000行 | 10,000行 |
|---|---|---|---|---|
| ストリーミング | 0.491 秒 | 1.162 秒 | 8.928 秒 | 13.788 秒 |
| DML | 1.617 秒 | 2.482 秒 | 3.312 秒 | 3.852 秒 |
| バルク | 1.447 秒 | 1.405 秒 | 1.751 秒 | 2.801 秒 |
考察
- ストリーミング挿入: 小規模なバッチ(100~500行)では最速です。大規模なバッチでは複数の API リクエストが必要となり、全体の時間が増加します。
- バルクロード: 一貫して安定したパフォーマンスを提供し、大規模なバッチサイズや複数回の挿入(500件以上)に最適です。
- DML: このテストサイズでは予想以上に良好なパフォーマンスを示しましたが、より大きなレコードサイズではパフォーマンスの違いがより顕著になる可能性があります。
まとめ:最適な方法を選択しましょう
リアルタイムのデータ利用、トランザクションの整合性、コスト効率の高い大規模データロードなど、どのようなニーズにも、CData BigQuery ドライバーはストリーミング、DML、バルクロードの3つの挿入方法すべてをサポートしています。 各方法には、ユースケースに応じた強みがあります。
CData BigQuery ドライバーを使い始めて、データワークフローに最適な方法を選択しましょう: