具有多个引用的 pgsql cte 仅运行一次

pgsql cte with multiple references only running once

提问人:user433342 提问时间:2/16/2015 更新时间:2/16/2015 访问量:737

问:

只是想知道,在pgsql cte中是否创建了一个临时表,并且每次加入查询时都不会重新执行cte?下面是 pgsql 和 sql server 版本的同一个查询,sql server 需要 6 秒,pgsql 只需要 3 秒。这是侥幸还是永远如此?

pgsql的:

with a as(select pg_sleep(3), 1 b)
select 1 
from a t1
join a t2 on t1.b=t2.b

SQL Server:

with a as(SELECT b FROM 
  OPENQUERY([anylinkedserver],'WAITFOR DELAY ''00:00:03'';select 1 b;'))
select 1 
from a t1
join a t2 on t1.b=t2.b
PostgreSQL数据库

评论

0赞 Vladimir Baranov 2/16/2015
我认为在SQL Server中会影响优化器。我会使用 和 query plan 来检查是否执行了两次。OPENQUERYSET STATISTICS IOCTE
0赞 user433342 2/16/2015
如果多次引用,Sql Server 总是会多次执行查询,我肯定知道这一点。我在问pgsql是如何运作的。

答:

3赞 Mike Sherrill 'Cat Recall' 2/16/2015 #1

WITH 查询的一个有用属性是它们只计算一次 每次执行父查询时,即使它们被引用更多 而不是父查询或同级 WITH 查询一次。因此,昂贵的 在多个位置需要的计算可以放在 WITH 查询以避免冗余工作。另一个可能的应用是 防止对具有副作用的功能进行不必要的多次评估。

来源:精品手册

评论

0赞 user433342 2/16/2015
一旦我点击了该页面上的递归标题,我就呆住了,他们真的应该把这个花絮放在一个粗体标题下,因为它与递归部分无关。谢谢!
0赞 Mike Sherrill 'Cat Recall' 2/16/2015
我不会和你争论。