У меня есть четыре таблицы в postgres (размер: 50 миллионов строк). Я хотел бы выполнить объединение для пары таблиц (после операции слияния), а затем объединить их, отсортированные по столбцу.
Запрос EXPLAIN выглядит следующим образом:
EXPLAIN (
SELECT i23.*, s23.score
FROM bp7_dataprep.id_23mer i23 JOIN bp7_dataprep.score_23mer s23 ON i23.seq = s23.seq
UNION
SELECT i9.*, s9.score
FROM bp7_dataprep.id_9mer i9 JOIN bp7_dataprep.score_9mer s9 ON i9.seq = s9.seq
ORDER BY id
) ;
EXPLAIN показывает вывод as:
Sort (cost=183017409154.40..183633517319.38 rows=246443265992 width=72)
Sort Key: i23.id
-> Unique (cost=93490775307.52..95955207967.44 rows=246443265992 width=72)
-> Sort (cost=93490775307.52..94106883472.50 rows=246443265992 width=72)
Sort Key: i23.seq, i23.id, s23.score
-> Append (cost=183991975.33..6428574120.56 rows=246443265992 width=72)
-> Gather (cost=183991975.33..248110189.48 rows=563676608 width=65)
Workers Planned: 2
-> Merge Join (cost=183990975.33..191741528.68 rows=234865253 width=65)
Merge Cond: ((i23.seq)::text = (s23.seq)::text)
-> Sort (cost=59046049.02..59633212.15 rows=234865253 width=57)
Sort Key: i23.seq
-> Parallel Seq Scan on id_23mer i23 (cost=0.00..8730486.53 rows=234865253 width=57)
-> Materialize (cost=124944926.31..127763309.35 rows=563676608 width=40)
-> Sort (cost=124944926.31..126354117.83 rows=563676608 width=40)
Sort Key: s23.seq
-> Seq Scan on score_23mer s23 (cost=0.00..12187639.08 rows=563676608 width=40)
-> Merge Join (cost=1.14..3716031271.15 rows=245879589384 width=51)
Merge Cond: ((s9.seq)::text = (i9.seq)::text)
-> Index Scan using score_9mer_seq_idx on score_9mer s9 (cost=0.57..12329705.30 rows=220649248 width=18)
-> Materialize (cost=0.57..15507927.70 rows=220649248 width=43)
-> Index Scan using id_9mer_seq_idx on id_9mer i9 (cost=0.57..14956304.58 rows=220649248 width=43)
Вышеуказанная команда выполняется слишком долго. Любые предложения по улучшению запроса.
DDL для четырех таблиц:
CREATE TABLE
id_23mer
(
seq CHARACTER VARYING NOT NULL,
id CHARACTER VARYING NOT NULL
);
CREATE TABLE
id_9mer
(
seq CHARACTER VARYING NOT NULL,
id CHARACTER VARYING NOT NULL
);
CREATE TABLE
score_23mer
(
seq CHARACTER VARYING NOT NULL,
score DOUBLE PRECISION
);
CREATE TABLE
score_9mer
(
seq CHARACTER VARYING NOT NULL,
score DOUBLE PRECISION
);
Примечание: у меня есть индексы для 'столбца seq' каждой таблицы.