14

Postgres データベースに多くの書き込みを行うプログラムを作成しています。典型的なシナリオでは、適切に正規化されたテーブルに 100,000 行を書き込みます (3 つの外部整数キー。これらの組み合わせがテーブルの主キーとインデックスになります)。私は PreparedStatements と executeBatch() を使用していますが、ラップトップで約 70 秒で 10 万行しかプッシュできませんでした。 10.

私はJDBCが初めてで、カスタムの組み込みDBに勝るとは思っていませんが、7倍ではなく、2〜3倍遅くなることを望んでいました. 私が行方不明かもしれないことは明らかですか?書き込みの順序は重要ですか?(つまり、インデックスの順序ではない場合はどうなりますか?)。もう少しスピードを絞り出すために見るべきことは?

4

4 に答える 4

8

これは、現在のプロジェクトで頻繁に対処しなければならなかった問題です。私たちのアプリケーションでは、挿入速度が重大なボトルネックです。ただし、大多数のデータベース ユーザーにとって、選択速度が主なボトルネックであることを発見したため、この問題に対処するリソースが他にもあることがわかります。

そこで、私たちが思いついたいくつかの解決策を以下に示します。

まず、すべてのソリューションには、postgres COPY コマンドの使用が含まれます。COPY を使用してデータを postgres にインポートする方法は、利用可能な最も速い方法です。ただし、JDBC ドライバーは現在、デフォルトでネットワーク ソケットを介した COPY をサポートしていません。そのため、これを使用する場合は、次の 2 つの回避策のいずれかを実行する必要があります。

  1. このような COPY をサポートするためにパッチを適用した JDBCドライバー
  2. 挿入するデータとデータベースが同じ物理マシン上にある場合は、ファイル システム上のファイルにデータを書き込んでから、COPY コマンドを使用してデータを一括でインポートできます。

速度を上げるための他のオプションは、JNI を使用して postgres api をヒットすることです。これにより、UNIX ソケットを介して通信し、インデックスとpg_bulkload プロジェクトを削除できます。ただし、最終的に COPY を実装しないと、常にパフォーマンスが低下します。

于 2008-12-16T00:19:25.843 に答える
1

明らかに、構成に最適なサイズを見つけるためにバッチのサイズを変更しようとすることができますが、3 倍になるとは思えません。

データベース構造の調整を試みることもできます。単一のフィールドを主キーとして使用すると、合成 PK を使用するよりもパフォーマンスが向上する場合があります。必要な整合性のレベルによっては、DB の整合性チェックを無効にすることで、かなりの時間を節約できる場合があります。

使用しているデータベースを変更することもできます。MySQL は、高速で単純な挿入にはかなり優れているはずです...そして、高度な同時アクセスで非常に高いパフォーマンスを得るために機能を削減しようとする MySQL のフォークがあることを私は知っています。

幸運を !

于 2008-12-15T16:05:18.693 に答える
1

インデックスを無効にして、挿入後に再度有効にしてみてください。また、プロセス全体をトランザクションでラップします

于 2008-12-15T16:16:31.323 に答える