使用C#在PostgreSql中进行批量插入

13 浏览
0 Comments

使用C#在PostgreSql中进行批量插入

我需要以编程的方式将数千万条记录插入到一个Postgres数据库中。目前,我正在使用一个查询执行数千个插入语句。\n有没有更好的方法来做这个,有没有我不知道的批量插入语句?

0
0 Comments

在使用C#进行PostgreSql的批量插入时的问题是,Postgres的默认行为是在每个语句之后进行提交,导致一些开销。为了避免这些开销,可以将多个插入或复制操作放在一个事务中,并批量提交。可以通过禁用自动提交来实现,同时还可以增加wal_buffers的大小来提高性能。

值得一提的是,同一个事务中可以添加的插入/复制操作的上限很高,远远超过你可能尝试的任何数量。可以在同一个事务中添加数百万行数据而不会出现问题。

关于这个问题是否会在事务运行时锁定表,还需要进一步的信息。

0
0 Comments

在使用C#进行PostgreSql的批量插入时的问题是,当数据量较大时,使用COPY命令会比使用多行值语法的插入方法更快。但是,如果遇到权限问题或者使用了行级安全性,就需要使用多行值语法进行插入。

解决方法是,在无权限问题和不需要行级安全性的情况下,可以使用COPY命令进行批量插入,性能更高。如果遇到权限问题或者使用了行级安全性,可以使用多行值语法进行插入。

总结起来,使用COPY命令进行批量插入可以提高性能,但是在特定情况下需要使用多行值语法进行插入。

以下是原文内容的整理:

PostgreSql支持多行值语法,可以替代使用COPY命令。可以通过以下代码示例进行多行值插入:

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

上述代码插入了两行数据,可以根据需要扩展,直到达到准备语句令牌的最大数量(可能是$999,但我对此并不完全确定)。有时候无法使用COPY命令时,可以使用多行值语法进行替代。

如果遇到权限问题,在尝试多行值语法之前,可以尝试使用COPY ... FROM STDIN命令。

如果使用了行级安全性,多行值语法是最好的选择。因为在版本12中,“不支持对具有行级安全性的表进行COPY FROM”。

使用COPY命令进行批量插入要比使用多行值语法更快。

在这种数据摄入的过程中,最重要的是转换,可以使用SQL标准来表达(不使用特殊工具)。

在我这里的性能表现非常好,370K行数据插入只需要3.291秒。

由于PostgreSQL的协议限制,绑定参数的最大数量限制为2个字节(short C类型),因此最多只能有65535个数据绑定参数。

0
0 Comments

问题的原因:

问题的原因是在使用C#进行PostgreSQL的批量插入时遇到了性能问题。原帖中提到了一些建议的方法,如使用COPY命令进行批量加载数据,并在加载数据之前移除索引和外键。然而,这些方法可能不够有效,因此用户提出了寻求更好解决方案的问题。

解决方法:

用户提到了一个解决方法,即使用NpgsqlBulkCopy库来进行批量插入。这个库可以提供更好的性能和效率。此外,用户还提到了另一个解决方法,即使用npgsql CopyIn类,因为它可以将数据映射为CSV格式并在PG查询语句中使用。

根据以上信息,我们可以得出以下结论:在使用C#进行PostgreSQL批量插入时,用户遇到了性能问题。为了解决这个问题,用户尝试了一些方法,如使用COPY命令和移除索引和外键。然而,这些方法可能不够有效,因此用户寻求更好的解决方案。用户提到了NpgsqlBulkCopy库和npgsql CopyIn类作为解决方案的候选项。这些方法可以提供更好的性能和效率。

0