SQL:2008 标准中是否指定了 CTE(带查询)的优化栅栏行为?如果有,在哪里?

Cra*_*ger 24 postgresql optimization sql-standard

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

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

例如,这些邮件列表帖子声称或建议它是标准的:

评论中提到它之后,我被问到它的指定位置 - 在查看了 SQL:2008 的唯一草案后,我可以访问我并没有太多运气找到它。

我还没有深入研究标准,所以我希望有人提出建议:标准实际上是否需要PostgreSQL中CTE的优化围栏?如果是这样,它在哪里指定?还是 Pg 邮件列表上的陈述有误?

另见todo list上的线程CTE优化围栏?.

Mik*_*ll' 10

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

一致的实现不需要执行通用规则中定义的确切操作序列,前提是它对 SQL 数据和模式、主机参数和主机变量以及 SQL 参数和 SQL 变量的影响与此相同序列。术语有效地用于强调可以通过实现以其他方式实现效果的动作。1

我认为一个实现者可以对一个公用表表达式求值 20 次,即使以 20 种不同的方式,仍然有一个一致的实现。唯一相关的问题是“其效果……与通用规则中定义的一系列动作的效果是否相同”。

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

  • 这是有道理的 - 由于 PostgreSQL 将允许在 CTE 中使用具有副作用的函数或数据修改语句,因此它必须屏蔽此类 CTE。我想这意味着可以自由地内联仅调用“STABLE”或“IMMUTABLE”函数的 CTE。 (2认同)