2009-06-18 2 views
2

非常に高速にレコードを挿入するためには、どのようなDBが最適でしょうか。レコードを挿入するのに最適なデータベース

DBにはテーブルが1つしかなく、アプリケーションは非常に簡単です。行をDBに挿入してコミットしますが、挿入率は非常に高くなります。

1秒あたり約5000の行挿入をターゲットにします。

Oracle \ SQLServerのような非常に高価なDBはどれもオプションです。

また、DBバックアップを取るための技術は何ですか?また、古いバックアップDBから1つのDBを作成することは可能ですか?

私はアプリケーションのクラッシュを余裕がないので、どのDBのInMemory機能も使用できません。私はそれを受け取るとすぐに行をコミットする必要があります。

+0

これを2つの質問に分割することをお勧めします。 –

答えて

2

多くのデータを短時間で挿入することを主な目的としているのであれば、おそらくファイルシステムだけで十分でしょう。

データをファイルに書き込むのはなぜですか(DB-friendly形式(csv、xml、...))。そうすれば、あまりにも多くの手間をかけずに、パフォーマンス目標の10倍を達成することができます。現在、大部分のOSはアプリケーションの障害時のデータ損失を防ぐのに十分な堅牢性を備えています。

編集:以下で述べるように、ジャーナリングファイルシステムは、ソフトウェア(またはRAIDアレイの場合はハードウェア)の障害でデータが失われないように設計されています。 ZFSは良い評判を持っています。

+0

ファイルを使用して一括挿入することができました。 Linuxでクラッシュした場合にファイルを回復できると確信していますか? – Geek

+0

zfsまたはジャーナルファイルシステムのいずれかが、システムクラッシュをきれいに処理します。 –

0

ハイスループットを得るには、大きなトランザクションにバッチインサートする必要があります。私は本当にあなたのクライアントから秒間に5000回ラウンドトリップすることを可能にするデータベースを見つけることはできないと思っています。

Sqliteはtons of inserts(1秒間に25K)を扱うことができますが、これはマルチスレッド化されておらず、そのデータはバッチ処理されています。

構造体が正しく設定されていると、mysqlまたはpostgresが1秒あたり5000行をサポートしない理由はありません(行が太すぎないと仮定した場合)。 MySQLとPostgresの両方は、より多くのトランザクションを処理するのにはもっと寛容です。

+0

SQLite – Geek

+0

のInMemoryのものを使用することはできません。これらのベンチマークはディスクに書き込まれたデータ用です。 –

+0

私はSQLiteを使用しましたが、DBが1,000万行に達すると、SQLiteの情報取得は遅すぎます。 MySQLがより良いと思いますか? – Geek

1

Postgresは、バッファがいっぱいになるか、システムが呼吸するまで本質的にRAMに挿入するWAL(Write Ahead Log)を提供します。大規模なWALキャッシュとUPS(安全のため)を組み合わせると、非常に効率的な挿入パフォーマンスが得られます。

0

SQLiteを使用できない場合は、をご覧ください。

+0

MySQLについてはどうですか? – Geek

+0

firebirdはマルチスレッド化の方がはるかに優れています(グローバルロックを使用するのとは逆に、同時にデータを読み書きすることができます) –

+0

@Geek - Firebirdは適切に設計されたネットワーク設定で、ネットワークトラフィックの発生を抑えることができます。もしそれがローカルの設定なら、あなたはMySQLを使うほうが良いでしょう。とにかく幸運。 – Galwegian

0

"従来の"リレーショナルDBMSであっても、望む性能は実現するのが難しくありません。 unclustered TPC-Cの結果を見ると(TPC-Cはトランザクション処理の事実上の標準ベンチマークです)、多くのシステムでは、クラスタ化されていないシステムでは10倍の要件が提供されます。あなたが安くてしっかりしているなら、DB2 Express-Cをチェックしてみてください。 2つのコアと2ギガバイトのメモリに制限されていますが、それはあなたのニーズを満たすのに十分なはずです。