我们在 AWS 上有一个 Postgres 数据库,其中的表将包含数百万(但不是数千万)行。主键是单列。数据访问将基本上均匀分布在数据行中,并且将是通过主键的简单 SELECT 语句,因此基本上我们要么得到一行,要么没有作为结果数据集。
我们的客户端是使用 node-postgres
模块用 Node.js 编写的。我们正在使用连接池。我们愿意尽一切合理的努力尽快执行我们的 SELECT;在这种情况下,准备好的语句或存储函数是个好主意吗?从理论上讲,什么会更快?
编辑:我们目前正在通过 node-psotgres
本身自带的 pg-pool
模块处理连接池,并为每个请求从池中选择一个新连接.我不确定服务器在准备语句或存储函数时所做的工作是否会在连接交回池时丢失。
最佳答案
您可以使用 node-postgres
模块以多种方式优化 Node.js 上的 PostgreSQL 查询性能,但对于您描述的用例,我觉得它们都不会提供显着的性能优势.一般tl;dr: 是基准、基准、基准。
准备好的陈述
使用准备语句和连接池并不互斥,但准备语句的查询计划仅在每个连接的基础上缓存。只要这些连接保持事件状态(只要 Pool 本身未关闭),缓存的查询计划就会保持不变并与执行它们的连接相关联。在最坏的情况下,多个连接分别为给定的准备好的查询执行一次计划阶段。
准备好的语句可能会带来一些性能优势,因为 node-postgres
确实在第一次执行后为它们跳过查询计划阶段(source, JavaScript,source, native bindings)。
原生绑定(bind)
说到 native 绑定(bind),node-postgres
模块的作者还维护了一组与 Node.js 兼容的 bindings to the native C libpq library。在包 node-pg-native
中。如果您的部署环境支持兼容的编译器,它们可能值得研究。
文档警告说 JavaScript 客户端和 native 绑定(bind)之间可能存在边缘情况不兼容,因此请务必在进行此类转换之前考虑到这些情况,以确保应用程序中的其他任何东西都不会中断。
关于sql - 使用 Node.js 客户端和连接池在 Postgres 中最快的查询 - 存储函数或准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414537/