【发布时间】: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