Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 简单的Postgresql libpq代码太慢?_C++_C_Postgresql_Libpq - Fatal编程技术网

C++ 简单的Postgresql libpq代码太慢?

C++ 简单的Postgresql libpq代码太慢?,c++,c,postgresql,libpq,C++,C,Postgresql,Libpq,我正在使用libpq开发postgresql。下面给出的代码花费了很多时间(在代码末尾给出了计时) 这里的查询首先准备好,然后执行。这个简单的插入大约需要5.5秒。是否有更好的方法来执行相同操作,或者我在这里做错了什么?在TCP连接上,每次插入都会导致到数据库的TCP往返。在5.5秒内完成50000次插入意味着一次TCP往返需要约0.1ms。您必须将其与您的网络设备的TCP基准进行比较,但使用此方法可能不会更快 你应该考虑从STDIN 复制到各个插件的代码>拷贝。在内部,这将缓冲内容,并且由于到

我正在使用libpq开发postgresql。下面给出的代码花费了很多时间(在代码末尾给出了计时)


这里的查询首先准备好,然后执行。这个简单的插入大约需要5.5秒。是否有更好的方法来执行相同操作,或者我在这里做错了什么?

在TCP连接上,每次插入都会导致到数据库的TCP往返。在5.5秒内完成50000次插入意味着一次TCP往返需要约0.1ms。您必须将其与您的网络设备的TCP基准进行比较,但使用此方法可能不会更快

你应该考虑从STDIN 复制到各个插件的代码>拷贝。在内部,这将缓冲内容,并且由于到服务器的往返次数大大减少,您可能会看到相当大的速度提高


请参阅,以获取与此副本形式相关的libpq API。

我遇到了类似的问题,并将我的插入序列转换为一个多行插入。尽管添加了大量字符串损坏和strcat调用,但这显著提高了性能:

1000 rows:
Individual Inserts: 22.609s
Multirow Insert: 1.217s

代码位于(还显示了将二进制数据插入一列的示例)

在不同线程中定义多个连接,并在这些线程中分发数据,并从这些线程中为每个项目发送插入命令。我做到了这一点,速度提高了5-10倍。如果您需要最新的C++11代码示例,请告诉我。

您只需发送50000个请求,这很正常!也许您可以调整lib以同时发送整个请求,这样会更快。另外,服务器是否在本地主机上?如果不是这样,一个更好的网络也会有所不同。这真的运行了1.5个小时吗?@vyegorov结果以毫秒为单位。@Geoffroy在这种情况下,服务器在我自己的机器上。但它也可以远程访问。它在1Gpbs连接上。我需要如何调整lib以同时发送整个请求?有什么建议吗?@c0da尝试搜索批量插入,这就是你想要做的。如果你不能使用
COPY
,你可以选择使用多行
INSERT
(即:在
值之后插入多个元组,例如
值(1,2,3)、(1,4,5)、(1,9,1);
),以减少往返。我假设
libpq
支持像
PgJDBC
这样的批处理操作,但我找不到任何证据,所以可能没有!EnterpriseDB的libpq有一个用于数据数组的批量发送接口,但它在vanilla libpq.c0da中不存在。您有没有找到一种方法来显著加快速度?
Prepared 0.55
Inserted 5527.52
count

50000
Printed 7.58
1000 rows:
Individual Inserts: 22.609s
Multirow Insert: 1.217s