提问人:user433342 提问时间:2/16/2015 更新时间:2/16/2015 访问量:737
具有多个引用的 pgsql cte 仅运行一次
pgsql cte with multiple references only running once
问:
只是想知道,在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
答:
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
我不会和你争论。
评论
OPENQUERY
SET STATISTICS IO
CTE