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

Where is query pipelining in libpq?

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

有没有什么方法可以调用一堆准备好的语句或其他流水线或使用方法batch mode

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

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

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

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

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

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

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

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

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

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 批处理实现类似的性能改进。

psycopg2 目前正在添加或已经添加了基于 libpq 的添加批处理和管道支持。