【问题标题】:Returning different queries together as a JSON object vs. multiple queries将不同的查询作为 JSON 对象与多个查询一起返回
【发布时间】:2018-12-20 15:31:06
【问题描述】:

为了呈现一个页面,我需要运行几个不相关的查询。

到目前为止,我一直将每个查询结果转换为 JSON 对象,然后再将它们与以下形式一起返回:

SELECT (SELECT array_to_json(array_agg(Q1)), (SELECT array_to_json(array_agg(Q2))

...因此产生一行,每列有一个查询结果。

但是,这些查询在概念上没有任何共同之处,只是最终应用程序需要一起使用。此外,调用array_to_jsonarray_agg 会产生与数据库逻辑相悖的开销。

我正在考虑拆分查询并在db.task 内使用pg-promisedb.batch 在查询之间共享相同的连接。

与第一种方法相比,使用这种方法有什么注意事项吗?什么是最好的性能?

【问题讨论】:

    标签: postgresql express postgresql-10 pg-promise


    【解决方案1】:

    在性能方面,最好执行多个不相关的查询,这些查询通过单个多查询字符串返回数据,作为单个事务/原子块。

    模块pg-promise 有专门的方法multi。如果你需要传递格式化参数,你可以像往常一样传递它们,这次覆盖所有查询的索引/名称,或者你可以在灵活的帮助器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内部处理。

    【讨论】:

    • 感谢您的支持。经过一些测试,结合 JSON 结果的方法似乎更快。与使用 multi/spread 的 35.497 毫秒相比,它需要 15.719 毫秒。我猜这种差异是由于缓存和 Postgres 的规划器利用了单个查询的组合(尽管查询本身是不相关的,但它们确实有共同的表)。我将运行 EXPLAIN ANALYZE 并尽快返回更多信息。
    • @Kathandrax 由于 SQL 执行计划器执行的优化,单个查询通常比多查询快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多