是否在SQL:2008标准中指定了CTE(WITH查询)的优化隔离行为?如果是这样,在哪里?


23

我看到对WITH查询(公用表表达式或CTE)的频繁引用充当了优化隔离,不允许服务器将过滤器下推到CTE查询中,将常用表达式从CTE中拉出,等等。成为SQL标准要求的行为。

CTE 绝对PostgreSQL中的优化栅栏……但这是标准要求的,还是实际上只是实现细节?

例如,这些邮件列表张贴声明或表明它是标准的:

评论中提到它之后,我被问到了它的指定位置-在查看了SQL:2008的唯一草稿后,我获得了访问它的机会,但运气并不好。

我尚未深入研究该标准,因此希望有人提出以下建议:标准实际上需要PostgreSQL中CTE的优化范围吗?如果是这样,它在哪里指定?还是Pg邮件列表上的语句有误?

另请参阅待办事项列表上的线程CTE优化围栏?

Answers:


10

我认为这是一个实施细节。

无需遵循标准的实现即可执行“通用规则”中定义的确切操作顺序,只要它对SQL数据和架构,对主机参数和主机变量以及对SQL参数和SQL变量的影响与该规则相同序列。术语有效地用于强调其效果可能会以其他方式由实现来实现操作。1个

我认为一个实现者甚至可以用20种不同的方式来评估一个公共表表达式20次,并且仍然具有一致的实现。唯一相关的问题是通用规则中定义的一系列动作的“效果……是否与效果相同”。

[1]。SQL 2008标准草案中的第6.3.3.3节“规则评估顺序”,具有本地文件名5CD2-01-Framework-2006-01.pdf,第6页。41我知道我从哪里得到的。Google可能知道。


2
这是有道理的-并且由于PostgreSQL将允许在CTE中使用具有副作用或对数据进行修改的语句的函数,因此它必须对此类CTE进行防护。我想这意味着可以内联仅调用STABLEIMMUTABLE函数的CTE 。
Craig Ringer 2012年

我觉得写的CTE是不是还没有任何SQL标准,但我还不能肯定。
Mike Sherrill'Cat Recall'

wCTE当然是PostgreSQL扩展。目前尚不清楚执行DML的函数是否正确,因为SQL中用户定义的函数是SQL/PSMPg完全不支持的函数……
Craig Ringer 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.