【发布时间】:2017-06-16 05:55:06
【问题描述】:
我正在使用 C#.NET 4.0 (Visual Studio 2010)、PostgreSQL 9.2 和 Npgsql 2.0.12。我无法升级到 Npgsql 3。
我需要快速插入父表,然后使用该插入的主键快速插入子表。
父表有一个定义为“串行”的列,它是主键。
子表有一个整数列,它是返回父表的外键。
并非每个父记录都会有子记录。一个父级可以有 0 个、1 个或多个子级。
目前我正在将父对象缓冲到列表中。当缓冲了 5000 个父级时,从线程池中生成一个新线程以将记录写入数据库。 (创建了一个新列表 让主线程缓冲下一组父对象。) 新线程调用 NpgsqlConnection.BeginTransaction(),然后在循环内调用 NpgsqlCommand.ExecuteScalar() 并带参数插入父记录并取回主键。 然后构建父对象的子对象(如果有)并保存到另一个列表。在循环结束时提交父母的交易。但是这种方法非常缓慢。插入 5000 条记录需要 3 到 10 秒。肯定有更好的方法。
在提交父母后,我使用 http://codebetter.com/karlseguin/2009/10/25/postgresql-day-2/ 中描述的 BulkCopy(它使用 NpgsqlCopyIn)来插入子记录。这太棒了。它在不到半秒的时间内插入数千条子记录。
我也很想将 BulkCopy 用于父记录。但我不知道如何从批量插入中取回主键值。
那么使用 C# 和 Npgsql 快速插入父子记录的诀窍是什么?答案可能就在某个地方,但显然我没有使用正确的搜索引擎参数。
非常感谢。
【问题讨论】:
标签: c# postgresql npgsql