我看到对查询(通用表表达式或 CTE)的频繁引用WITH
充当优化围栏,其中不允许服务器将过滤器向下推送到 CTE 查询中,将通用表达式拉出 CTE 等等。经常声称是 SQL 标准要求的行为。
CTE绝对是PostgreSQL中的优化栅栏……但这是标准要求的,还是实际上只是实现细节?
例如,这些邮件列表帖子声称或暗示它是标准的:
在评论中提到它之后,我被问到它是在哪里指定的 - 在查看了 SQL:2008 的唯一草稿之后,我可以访问我没有太多运气找到它。
我还没有深入研究这个标准,所以我希望有人能给我一个建议:PostgreSQL 中 CTE 的优化围栏是否真的是标准所要求的?如果是这样,它在哪里指定?还是 Pg 邮件列表上的陈述有误?
另请参阅待办事项列表上的线程 CTE 优化围栏?.
我认为这是一个实现细节。
我认为实现者可以评估一个公用表表达式 20 次,甚至以 20 种不同的方式,并且仍然有一个一致的实现。唯一相关的问题是“其效果……是否与一般规则中定义的一系列动作的效果相同”。
[1]。第 6.3.3.3 节,“规则评估顺序”,在 SQL 2008 标准草案中,本地文件名为 5CD2-01-Framework-2006-01.pdf,p。41 我不知道我从哪里弄来的。谷歌可能知道。