为了呈现一个页面,我需要运行几个无关的查询。
到目前为止,我一直在将每个查询结果转换为JSON对象,然后将它们与表单的内容一起返回:
SELECT (SELECT array_to_json(array_agg(Q1)), (SELECT array_to_json(array_agg(Q2))...thus生成一行,每列有一个查询结果。
然而,这些查询在概念上没有任何其他共享,只是在最终应用程序之前需要在一起。此外,调用array_to_json和array_agg会产生一种与数据库逻辑相反的开销。
我正在考虑拆分查询,并使用pg-promise的db.batch在db.task中共享查询之间的相同连接。
与第一种方法相比,是否存在使用这种方法的注意事项?什么才是最好的表现?
发布于 2018-12-19 13:25:29
就性能而言,最好是执行多个不相关的查询,这些查询通过单个多查询字符串作为单个事务/原子块返回数据。
模块pg-承诺有专门的方法多点。如果您需要传递格式化参数,您可以像往常一样传递它们,包括这次所有查询的索引/名称,或者在灵活助手helpers.concat的帮助下,为每个查询分别提供格式化参数,以便在单个命令中生成最终的多查询字符串:
const queries = [
{query: 'SELECT ...', values: ...},
{query: 'SELECT ...', values: ...},
{query: 'SELECT ...', values: ...}
...
];
const q = ()=> pgp.helpers.concat(queries);
db.multi(q)
.then(([data1, data2, data3]) => {...})
.catch(error => {...})请注意,我们将q定义为一个函数,因此与格式相关的错误由查询方法封装,并在.catch中处理。
https://stackoverflow.com/questions/53851409
复制相似问题