Как оптимизировать время выполнения объединения и объединения нескольких таблиц (50 миллионов строк) в Postgres - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть четыре таблицы в 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' каждой таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...