【发布时间】:2015-04-24 04:57:17
【问题描述】:
我有一个 Vb.Net 应用程序 (VS2010) 以及 Postgres 9.3 和 psqlodbc 版本 9.3.4。我通过 ODBCConnection 和 PostgreSQL odbc 驱动程序与我的 Postgres 数据库进行交互。
即使在我的本地机器上执行简单的事务性批量插入数据库表(没有索引或其他高科技东西,只是普通的旧记录和一个串行列作为主键)也很慢(即,应用程序写入数据到不涉及网络的本地 postgres 数据库)。 我已经看到每秒 1000-1500 行的速度。我的硬件是 Win7 64 位,一个 Sata 6gbs 硬盘,8GB 内存。
根据 Maxim Egorushkin 在How to speed up insertion performance in PostgreSQL 上的帖子,他建议使用:
SQLSetConnectAttr(conn, SQL_ATTR_AUTOCOMMIT, reinterpret_cast(SQL_AUTOCOMMIT_OFF), 0);
防止发生自动提交。我想知道如何从 .net 调用此子例程,因为它似乎是 WIN API 的一部分,因此“conn”变量可能是非 .Net 对象的句柄。
我相信这种方法或其他方法应该能够加快速度:显然,用于 postgres 的非免费 PGNP ODBC 驱动程序每秒可以执行 1000 次插入。
非常感谢有关如何禁用自动提交的意见。
【问题讨论】:
-
如果您要执行 1000 次单独的 SQL 插入,那么您将不会有很多往返数据库的时间——如果它在另一台服务器上,那将会很慢,尤其是在tcp/ip。现在,如果您可以使用批量插入 sql,那么它会快很多……您是在编写 SQL,还是可以判断它是每行 1 次插入还是批量插入?
-
嗨@Joe,这是一个批量插入,在 1 个事务中插入了许多记录,我使用的参数会有所帮助...明天我会先尝试 Mike 的建议,然后在这里发回.
-
我不是指在 1 个事务中插入一堆。我的意思是在 1 条语句中插入一堆。使用 1 条语句插入 2 行的示例:INSERT INTOfilms (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), (' HG120','晚餐游戏',140,默认,'喜剧');
-
在完成时说“开始交易”和“提交”。注意:“交易”一词是可选的。同样,如果您使用多插入语句,您将获得更好的性能。或者,您可以使用复制命令
-
感谢@Joe,我尝试了在事务中每次插入多条记录,并实现了大约 x4 的性能提升。您的建议起到了很大的作用,消除了瓶颈,非常感谢。
标签: vb.net postgresql bulkinsert