Я создал две таблицы (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. Затем я выполнилsql с A и B по отдельности:
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.
Итак, япроверив EXPLAIN двух sql, я обнаружил, что A использовал Hash Join , но B использовал Nested-Loop Join .
Есть ли какая-то причина, по которой секционированная таблица использует объединение с вложенными циклами?Разве для Greenplum нет необходимости использовать раздел таблицы при хранении миллионов данных?