2012-04-24 15 views
2

埋め込み型のHSQLDBに約10万行の平均文字列を約1300万行挿入するアプリケーションがあります。私はバッチサイズ、シングルスレッド/マルチスレッド、キャッシュ/非キャッシュテーブル、MVCCトランザクション、log_size/noログ、checkpointへの通常の呼び出しなど)を調整していますが、それでも16コアで7時間かかります。 12 GBのマシン。HyperSQL(HSQLDB):大容量の挿入パフォーマンス

私はHSQLDBを選択しました。これらのコアをすべて使いこなすとかなりのパフォーマンスが得られるかもしれないと思ったので、私は真剣に私の決定を疑い始めました。

誰でも私に銀色の弾丸を見せてもらえますか?

+2

(HSQLDBの専門家ではない)推測を危険にさらし、メインブロッカーがIO(ディスク)にあるとします。 – hkf

+0

ええ、私は、CPUのパーセンテージが正確に屋根を通っていないので、それを考えました。バッチインサートを複数のスレッドから実行することにメリットはありますか?この場合、1つのスレッドに固執すべきですか? –

+0

SSDベースのソリュチョムを実装できない限り、おそらくそうではありません。 – hkf

答えて

1

アプリケーションが行っていることを確認してください。まず、タスクマネージャー(またはOS特有の比較可能ファイル)とvisualvmのリソース使用率を調べることです。悪いパフォーマンスをさせるための

良い候補:

  • ディスクIO
  • ガベージコレクタは
0

H2DatabaseはあなたにHSQLDB(構文との互換性を維持しながら)よりもわずかに良いパフォーマンスを与える可能性があります。

いずれの場合でも、ランダムアクセスディスクI/Oを減らすために、ディスクとの同期に高い遅延を使用することをお勧めします。 (すなわち、SET WRITE_DELAY <num>

行ごとに1つの挿入ではなく、バルクINSERTステートメントを実行していることを望みます。そうでない場合は、可能であれば実行してください。

アプリケーションの要件に応じて、RDBMSよりもキー値ストアを使用する方がよい場合があります。 (通常、1.3 * 10^7エントリを挿入する必要がありますか?)

主な制限要因は、ディスクへのランダムアクセス操作です。私は、あなたがやっていることがCPUに縛られていることを非常に疑っています。 topを見てからiotopと比較してください。

0

非常に多くのレコードがあるので、NoSQL DBへの切り替えを検討することもできます。もちろん、保存する必要があるデータの性質やフォーマットにも依存します。

5

キャッシュされたテーブルでは、ほとんどの場合、ディスクIOが使用されています。同じテーブルに挿入するため、複数のスレッドは必要ありません。パフォーマンスを顕著に向上させる1つのことは、パラメータ化されたPreparedStatmentを1つずつ再利用して、各行挿入のパラメータを設定することです。

マシン上では、メモリマップされたIOに大きなNIO制限を使用することで、IOを大幅に改善できます。例えば、SET FILES NIO SIZE 8192。 64ビットJVMは、より大きなサイズが効果を発揮するために必要です。

http://hsqldb.org/doc/2.0/guide/management-chapt.html

一括挿入使用SET FILES LOG FALSEの期間IOを低減し、インサートの最後までチェックポイントを実行しないでください。詳細はここで説明されています

http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#dec_bulk_operations

UPDATE:挿入テストを16以下万行で1.9ギガバイト.dataのファイルをもたらし、平均2コアプロセッサと7200 RPMディスクにわずか数分かかりました。鍵は大きなNIO割り当てです。

connection time -- 47 
complete setup time -- 78 ms 
insert time for 16384000 rows -- 384610 ms -- 42598 tps 
shutdown time -- 38109 
+0

これはどのオペレーティングシステムですか?私は、大規模なバッチインサートがOS Xでは適度に高速であり、Windows上では(ハードウェア構成のさまざまな点で)低速であることがわかっています。内蔵のハードドライブを使用して、2007年中頃のMac Miniで約108,000行の挿入に約1分かかります。旧バージョンの仮想化されていない旧バージョンのWindowsサーバーでは約15分、旧称の非仮想Dell 750 Windowsサーバーでは約20分後に約15分かかります。 –

+0

気にしない - 問題がインデックス関連であることが判明しました。インデックスを追加すると問題は解決しました。 –

関連する問題