我需要运行几个不相关的查询才能呈现页面。
直到现在,我一直将每个查询结果转换为JSON对象,然后再将它们与以下形式的返回:
SELECT (SELECT array_to_json(array_agg(Q1)), (SELECT array_to_json(array_agg(Q2))
...因此产生一行,每列有一个查询结果。
但是,这些查询在概念上只共享最终应用程序所需要的任何东西。另外,调用array_to_json
和array_agg
会产生开销,这似乎与数据库逻辑背道而驰。
我正在考虑拆分查询,并在pg-promise
中使用db.batch
的{{1}}在查询之间共享相同的连接。
与第一种方法相比,有没有使用这种方法的警告?最佳的性能选择是什么?
答案 0 :(得分:2)
从性能角度来看,最好是执行多个不相关的查询,这些查询通过单个多查询字符串作为单个事务/原子块返回数据。
模块pg-promise专门具有方法multi。而且,如果您需要传递格式参数,则可以将其作为常规变量传递,包括这次所有查询的索引/名称,也可以在灵活的辅助工具{{3的帮助下,为每个查询分别提供格式参数}}在单个命令中生成最终的多查询字符串:
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
内进行处理。