【问题标题】:Speed up Postgresql insert performance from vb.net从 vb.net 加快 Postgresql 插入性能
【发布时间】: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


【解决方案1】:

对每个事务进行多次插入是不够的。 像这样使用单个多行插入语句:

INSERT INTO films (code, title, did, date_prod, kind) 
VALUES 
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), 
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

您可以在 1 次插入中放入的记录越多,插入的速度就越快。这有多种原因,其中一个原因是到服务器的往返行程 - 每个单独的 sql 语句至少有 1 次往返行程,当您执行数千行时,这可能会极大地消耗性能。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2011-10-28
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多