【发布时间】:2018-06-04 07:09:14
【问题描述】:
我创建了两个表(A,B),有 100 列,相同的 DDL,除了 B 已分区
CREATE TABLE A (
id integer, ......, col integer,
CONSTRAINT A_pkey PRIMARY KEY (id))
WITH (OIDS = FALSE)
TABLESPACE pg_default
DISTRIBUTED BY (id);
CREATE TABLE B (
id integer, ......, col integer,
CONSTRAINT B_pkey PRIMARY KEY (id))
WITH (OIDS = FALSE)
TABLESPACE pg_default
DISTRIBUTED BY (id)
PARTITION BY RANGE(id)
(START (1) END (2100000) EVERY (500000),
DEFAULT PARTITION extra
);
并将相同的数据(2000000行)导入A和B。然后我分别用A和B执行sql:
UPDATE A a SET a.col = c.col from C c where c.id = a.id
UPDATE B b SET b.col = c.col from C c where c.id = b.id
结果A过了一分钟就成功了,但是B花了很长时间,最后出现内存错误:
ERROR: Canceling query because of high VMEM usage.
于是我查看了两个sql的EXPLAIN,发现A使用了Hash Join,而B使用了Nested-Loop Join。
分区表使用嵌套循环连接有什么原因吗? greenplum在存储百万数据时是否不需要使用表分区?
【问题讨论】:
标签: greenplum