11

問題は、Java アプリケーションから 1 つのテーブルに膨大な数 (100 万以上) のレコードを挿入する必要があることです。レコードは Java コードによって作成され、別のテーブルからの移動ではないため、INSERT/SELECT は役に立ちません。

現在、私のボトルネックは INSERT ステートメントです。プロセスを高速化するために PreparedStatement を使用していますが、通常のサーバーでは 1 秒あたり 50 件を超えるレコードを取得できません。テーブルはまったく複雑ではなく、インデックスも定義されていません。

プロセスに時間がかかりすぎて、時間がかかると問題が発生します。

可能な最大速度 (INSERT/秒) を得るにはどうすればよいですか?

データベース: MS SQL 2008。アプリケーション: Java ベース、Microsoft JDBC ドライバーを使用。

4

7 に答える 7

10

インサートをバッチ処理します。つまり、一度に 1 行ずつ送信するのではなく、一度に 1000 行のみを送信するため、往復/サーバー呼び出しが大幅に削減されます。

JDBC ドライバーの MSDN でのバッチ操作の実行。これは、再設計せずに本物のバルク メソッドを使用する最も簡単な方法です。

各挿入を解析し、コンパイルして実行する必要があります。バッチは、1000 (たとえば) の挿入が一度にコンパイルされるため、解析/コンパイルが大幅に少なくなることを意味します。

より良い方法がありますが、これは、生成された INSERT に限定されている場合に機能します

于 2010-05-04T14:19:02.983 に答える
6

BULK INSERTを使用してください- これはまさにあなたが求めているもののために設計されており、挿入の速度を大幅に向上させます。

また、(実際にインデックスがない場合に備えて)インデックスの追加を検討することもできます - 一部のインデックス (ほとんどは主キーのインデックス) により、挿入のパフォーマンスが向上する場合があります。

レコードを挿入できる実際の速度は、正確なデータ、テーブル構造、および SQL サーバー自体のハードウェア/構成に依存するため、具体的な数値を示すことはできません。

于 2010-05-04T14:37:34.957 に答える
2

一括操作一括操作を調べましたか?

于 2010-05-04T14:18:43.243 に答える
1

バッチ更新の使用を検討しましたか?

于 2010-05-04T14:23:56.277 に答える
1

テーブルに整合性制約またはトリガーはありますか? その場合は、挿入の前にドロップすると役立ちますが、結果を許容できることを確認する必要があります。

于 2010-05-04T15:31:03.580 に答える
0

Sql Server の bcp ユーティリティを調べます。

これは、区切りファイルを生成し、外部ユーティリティを使用してデータをインポートするという点で、アプローチが大きく変わることを意味します。しかし、これは多数のレコードを Sql Server db に挿入する最速の方法であり、ロード時間を桁違いに高速化します。

また、これは 1 回限りの操作ですか、それとも定期的に発生する操作ですか? 一度だけの場合は、このプロセスをコーディングするのではなく、db ユーティリティを組み合わせてエクスポート/インポートを実行することをお勧めします。

于 2010-05-04T14:23:51.047 に答える
0

ETLエンジンを使用することをお勧めします。ペンタホが使えます。それは無料です。ETL エンジンは、データの一括読み込みと、必要なあらゆる形式の変換/検証を行うために最適化されています。

于 2010-05-04T14:47:44.320 に答える