【问题标题】:Transactions or procedures for multiple queries, which depend on previous queries in transaction?多个查询的事务或过程,这取决于事务中的先前查询?
【发布时间】:2020-03-25 08:28:09
【问题描述】:

如果事务中的每个下一个查询都依赖于前一个查询的结果,我正在尝试找出哪种方法更适合实现多个查询。

比如有个表

id |  values
1  |   253
2  |   742
...|   ...

并且查询堆栈中的第一个查询从具有给定 id 的行返回字段 values 的值 v1。查询堆栈中的第二个查询应该从 id 等于 v1 的行返回字段 values 的值 v2 > 由上一个查询等返回。 我知道这个任务可能看起来很奇怪,但这是一个需要解决的更复杂和有用的任务的简化版本。

为我解决它的第一个(最简单的)方法是在一个事务中组合这多个相互依赖的请求。但是,我找不到与如何在单个事务中执行所描述的查询堆栈相关的任何信息。事务中的每个下一个查询是否会等待上一个查询响应?是每次向数据库发送请求并等待其响应所花费的时间,还是将所有请求与一个事务同时发送到数据库并等待数据库响应发生一次?

我试图了解 - 在 DBMS 端使用过程是否有优势?

我认为使用过程可以减少从应用程序到数据库的查询次数。而且我认为每个这样的请求都是昂贵的。

我问这个问题的答案 - 哪种方法更适合用于所描述的任务,以提高性能并减少与数据库交互的时间?

谢谢!

更新:

我还尝试使用带有递归 cte 的查询来解决此任务。

不幸的是,在实际任务中,我必须在另一个递归查询的每次迭代中使用这样的递归查询。结果证明该算法非常复杂,我很难开发它。所以,问题是 - 也许在应用程序级别描述的一个事务中使用大量查询会产生类似的性能结果?但是我担心这种方法会导致每个请求都等待来自数据库的响应,并且会很慢。

或者我可以结合这些方法 - 即,使用递归 cte 读取部分数据,然后根据从先前递归 cte 接收的数据等形成下一个递归 cte。并在一个事务中执行它们。

【问题讨论】:

    标签: sql postgresql transactions recursive-query


    【解决方案1】:

    您正在描述一个迭代过程,可以通过递归查询在 SQL 中实现。

    在 Postgres 中,它看起来像:

    with recursive cte as (
        -- anchor
        select id, values, 0 lvl from mytable where id = ?
        union all
        -- recursion
        select t.id, t.values, lvl = 1
        from mytable t
        inner join cte c on c.values = t.id
    )
    select * from cte
    

    anchor 通过id 选择起始行,然后递归部分遵循关系直到耗尽。您可能想阅读Postgres documentation on this 了解更多详细信息和说明。

    虽然可能比重复查询方法更有效,但递归查询对于深度嵌套的层次结构并不是很有效; SQL 是一种基于集合的语言,主要不是为此类活动设计的。

    【讨论】:

    • 不幸的是,在实际任务中,我必须在另一个递归查询的每次迭代中使用这样的递归查询。并且有 3 个这样的嵌套查询。算法结果非常复杂,我很难开发它。所以,问题是 - 也许在应用程序级别描述的一个事务中使用大量查询会产生类似的性能结果?但是我担心这种方法会导致每个请求都等待数据库的响应,并且会很慢。
    • 或者我可以结合这些方法 - 即使用递归 cte 读取部分数据,然后根据从先前递归 cte 接收到的数据等形成下一个递归 cte。
    • @ToddBarry:是的,可能是这个想法。
    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多