libpq 中的查询流水线在哪里?

问题描述

我正在使用 C++ 和 libpq(libpqxx 非常不稳定)开发高负载服务器应用程序。我在线程中使用异步查询来提高性能。但我发现,例如,PQsendQuery("SELECT 1;SELECT 1;") 的运行速度比执行 PQsendQuery("SELECT 1") 两次要快。

有什么方法可以调用一堆准备好的语句或其他管道或使用 batch mode方法吗?

已编辑:摘要:如何在 libpq 中获得最佳性能

解决方法

libpq 将支持 PostgreSQL 14 中的查询流水线。只要您使用新的 libpq,您就可以在旧的 PostgreSQL 版本上使用它。见commit acb7e4eb6b

I wrote a patch for it in 2016 as a bit of a fire-and-forget weekend hack 在很多人的努力下,它已经变成了一个成熟的特性并合并到 PostgreSQL 14 中。

PostgreSQL 14 的文档讨论了 pipeline mode

请注意,PgJDBC 多年来一直使用标准的 JDBC 批处理接口支持批处理模式。对于许多应用程序,您可以使用 PgJDBC 批处理实现类似的性能改进。

,

每次使用 PQsendQuery() 执行查询并使用 PQgetResult() 获取结果时,都会有一次到数据库服务器的往返行程。这需要时间。如果您在一个查询中执行多个命令,则可以节省一次往返行程。

我从未听说过批处理模式,它似乎也从未出现在官方的 libpq 版本中。

不过你有一些选择。哪种最适合您取决于您​​的用例。

  • 如果您需要在同一个表中插入多行,在一个查询中执行此操作会快很多。您可以使用具有不同行数的预准备查询或动态构建查询。如果您使用后者,请不要忘记进行适当的 SQL 转义!

  • 如果您需要插入多行,在单个事务中执行此操作可能会更快。 PostgreSQL manual 有一些额外的技巧。

  • 您可以使用 pgpool 或自定义解决方案缓存查询结果,例如使用 memcached。

  • 使用存储过程组合多个查询。

  • 使用更复杂的 SELECT 查询或视图来组合多个查询。