gpt4 book ai didi

sql - 在 Greenplum 中实现公用表表达式

转载 作者:行者123 更新时间:2023-11-29 14:12:06 28 4
gpt4 key购买 nike

有没有办法强制 Greenplum PostgreSQL 在 WITH 子句中具体化子查询,例如 MATERIALIZEINLINE optimizer hints在 Oracle 中执行以下操作?

WITH dept_count AS (
SELECT /*+ MATERIALIZE */ deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT ...

我已经搜索了一段时间,只是在 Oracle 中找到了这个功能。

我知道我可以使用CREATE TABLE AS,但我有几个类似的查询,迫使我在每次查询后删除临时表,这非常不方便,而且可能效率低下。

更新:我测试了下表:

CREATE TABLE test (id: INT);

EXPLAIN WITH test2 AS (SELECT id FROM test)
SELECT COUNT(*) FROM test2;

QUERY PLAN
------------------------------------------------------------------------------------
Aggregate (cost=0.36..0.37 rows=1 width=8)
-> Gather Motion 32:1 (slice1; segments: 32) (cost=0.01..0.35 rows=1 width=8)
-> Aggregate (cost=0.01..0.01 rows=1 width=8)
-> Subquery Scan test2 (cost=0.00..0.00 rows=1 width=0)
-> Seq Scan on test (cost=0.00..0.00 rows=1 width=4)

我正在使用 Greenplum Postgresql 8.2

最佳答案

在 PostgreSQL 中,CTE 是一个优化障碍,它强制 CTE 术语具体化。这有望在未来的版本中改变,但如果有的话,将提供向后兼容性选项。

如果您对查询执行explain analyze,您会发现dept_count 项作为CTE 扫描<在单独的计划树中执行。它像物化结果一样累积到元组存储中,IIRC。

更新:作者实际使用的是Greenplum。上面的说法对 Greenplum 来说似乎并不正确,Greenplum 在 PostgreSQL 8.2 代码库之上实现了自己的 CTE 支持,或者对 8.4 CTE 功能进行了非直接的向后移植,并进行了重大更改。在 Greenplum 中,您可能不得不使用临时表,除非有额外的 Greenplum 特定功能可用。

关于sql - 在 Greenplum 中实现公用表表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15306199/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com