使用Node.js客户端和连接池进行Postgres中最快的查询-存储的函数还是准备好的语句?

时间:2018-11-21 14:44:26

标签: sql node.js postgresql query-optimization

我们在AWS上拥有一个Postgres数据库,该表将包含数百万(而不是数千万)行。主键是单列。数据访问将基本上均匀地分布在数据行之间,并且将通过主键成为简单的SELECT语句,因此基本上我们只得到一行或不得到一行作为结果数据集。

我们的客户端是使用node-postgres模块在​​Node.js中编写的。我们正在使用连接池。我们想尽一切可能的事情,以尽可能快的速度执行SELECT。在这种情况下,准备好的语句或存储的函数会是一个好主意吗?在纸面上,更快的速度是什么?

编辑:我们目前正在通过pg-pool本身随附的node-psotgres模块来处理连接池,并针对每个请求从池中选择一个新连接。我不确定在将连接交还给池时,服务器在准备语句或存储函数时所做的工作是否会丢失。

1 个答案:

答案 0 :(得分:1)

您可以使用node-postgres模块通过几种方式针对Node.js上的PostgreSQL查询性能进行优化,但是根据您所描述的用例,我觉得它们都不会有明显的性能优势。一般 tl; dr:是基准,基准,基准。

准备好的声明

使用准备好的语句和连接池不是互斥的,但是准备好的语句的查询计划仅在每个连接的基础上进行缓存。只要这些连接保持活动状态(只要不关闭Pool本身),高速缓存的查询计划便会保持不变并与执行它们的连接相关联。在最坏的情况下,多个连接将针对给定的准备好的查询分别执行一次计划阶段。

由于node-postgres 确实在第一次执行(source, JavaScriptsource, native bindings)之后跳过了它们的查询计划阶段,因此准备好的语句可能会带来一些性能上的好处。

本地绑定

说到本地绑定,node-postgres模块的作者还在包node-pg-native中维护了bindings to the native C libpq library的Node.js兼容集。如果您的部署环境支持兼容的编译器,则可能值得研究。

文档警告说,JavaScript客户端和本机绑定之间可能存在边际情况不兼容的情况,因此请确保在进行此类转换之前将这些考虑在内,以确保应用程序中的其他内容都不会中断。