pgsql cte,多个引用只运行一次

时间:2015-02-15 23:06:03

标签: postgresql

只是想知道,在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

1 个答案:

答案 0 :(得分:1)

  

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

来源:The fine manual