C#.NET 4.0(Visual Studio 2010)、PostgreSQL 9.2、およびNpgsql 2.0.12を使用しています。 Npgsql 3にアップグレードすることはできません。C#とNpgsqlを使用して親テーブルと子テーブルに高速に挿入
親テーブルに高速挿入を行い、その挿入キーの主キーを使用して子テーブルに高速挿入する必要があります。
親テーブルには、プライマリキーである「シリアル」として定義された列があります。
子テーブルには、親テーブルの外部キーである整数列があります。
すべての親レコードに子供がいるわけではありません。親は0,1、または複数の子を持つことができます。
現在、私は親オブジェクトをリストにバッファリングしています。 5000の親がバッファリングされると、レコードをデータベースに書き込むためにスレッドプールから新しいスレッドを生成します。 新しいスレッドは、NpgsqlConnection.BeginTransaction()を呼び出し、ループ内で、親レコードを挿入するパラメータを持つNpgsqlCommand.ExecuteScalar()を呼び出すとともに、親レコードを挿入します。主キーを戻す。 次に、親の子オブジェクトがあればそれを構築し、別のリストに保存します。ループの最後に、親のトランザクションをコミットします。しかし、この方法論は非常に遅いです。どこでも5000レコードを挿入するのに3秒から10秒。確かに良い方法があります。
親がコミットされた後、http://codebetter.com/karlseguin/2009/10/25/postgresql-day-2/(NpgsqlCopyInを使用)で説明されているBulkCopyを使用して、子レコードを挿入します。これは素晴らしい作品です。これは、半秒未満で数千の子レコードを挿入します。
親レコードにもそのBulkCopyを使用したいと思います。しかし、私はどのように一次キー値を一括挿入から戻すのか分かりません。
C#とNpgsqlを使用して、親レコードと子レコードを高速に挿入するにはどうすればよいですか?その答えはおそらくどこかにありますが、明らかに私は正しい検索エンジンのパラメータを使用していません。
ありがとうございます。
ありがとう@Hambone、および入力を提供したすべての人に。このソリューションは完全に機能しました。私はExecuteScalarの呼び出しが 'select nextval ...'を実行しているときの速さに感心しています。乾杯! – TJH