【发布时间】:2013-03-09 01:40:59
【问题描述】:
有没有办法强制 Greenplum PostgreSQL 在 WITH 子句中实现子查询,就像 MATERIALIZE 和 INLINE 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
【问题讨论】:
-
请张贴
explain analyze输出。 -
PostgreSQL 8.2? CTE 已在 Postgres 8.4 中引入。你是说9.2吗?
-
现在是 8.2。我在 Greenplum 上运行,Greenplum 只支持旧版本的 Postgres
-
我很困惑。如何在 8.2 中运行 CTE?或者这是 Oracle 的 EXPLAIN 输出?此外,在不是我的帖子下,您需要在 cmets 中使用
@-reply 以确保我收到通知。 -
@Yang 另外,如果您使用的是 Greenplum 或类似产品,请提前说明。当人们发布有关 3rd 方 PostgreSQL 变体而没有说明时,这非常令人困惑,因为已经进行了各种修改。 PostgreSQL 甚至没有
Gather Motion计划节点,根本没有这样的东西; Pg 8.2 也没有 CTE 支持。 所以你的问题根本不是关于 PostgreSQL...
标签: sql postgresql common-table-expression greenplum