Как получить Postgresql общая стоимость времени из объяснения - PullRequest
0 голосов
/ 02 марта 2020

У меня запрос sql на postgresql 9.5, но это занимает слишком много времени. И я запускаю запрос объяснения:

DELETE FROM source v1
    WHERE id < (SELECT MAX(id)
            FROM source v2
            WHERE v2.ent_id = v1.ent_id
            AND v2.name = v1.name
        );      

И ex plain это

Delete on source v1  (cost=0.00..1764410287608.21 rows=2891175 width=6)');
  ->  Seq Scan on source v1  (cost=0.00..1764410287608.21 rows=2891175 width=6)');
        Filter: (id < (SubPlan 2))');
        SubPlan 2');
          ->  Result  (cost=203424.76..203424.77 rows=1 width=0)');
                InitPlan 1 (returns $2)');
                  ->  Limit  (cost=0.43..203424.76 rows=1 width=8)');
                        ->  Index Scan Backward using source_id_ix on source v2  (cost=0.43..813697.74 rows=4 width=8)');
                              Index Cond: (id IS NOT NULL)');
                              Filter: (((ent_id)::text = (v1.ent_id)::text) AND ((name)::text = (v1.name)::text))');

В моей таблице около 8.000.000 записей. И я не мог получить результат в течение нескольких дней. И я не мог рассчитать, сколько раз займет? есть ли способ найти новое решение?

1 Ответ

2 голосов
/ 02 марта 2020

Нет действительно хорошего способа предсказать время выполнения.

Как очень грубое практическое правило, вы можете сравнить стоимость 1 со временем чтения одной 8-килобайтной страницы с диска во время последовательного сканирования. , но это часто будет более чем на порядок.

Чтобы решить основную проблему, попробуйте

DELETE FROM source AS v1
WHERE EXISTS (SELECT 1
              FROM source AS v2
              WHERE (v1.ent_id, v1.name) = (v2.ent_id, v2.name)
              AND v2.id > v1.id);

Проблема с вашим запросом заключается в том, что он должен выполнять дорогое выполнение. отбор для каждого найденного ряда, в то время как мой может выполнить полусоединение. Посмотрите на план выполнения моего запроса.

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