LINUX.ORG.RU

Постгрес игнорирует unique index

 ,


0

1
INSERT INTO engine_page
            (url, source_id)
            (SELECT b.external_url, a.source_id
               FROM engine_video a
              INNER JOIN engine_videoinfo b ON b.video_id=a.id
                WHERE NOT EXISTS
                    (SELECT 1
                       FROM engine_page c
                      WHERE c.url=b.external_url)
              ORDER BY a.last_check, a.id
              LIMIT 100);

Народ есть такой запрос. Поле url в таблице engine_page уникальное, но отрабатывает супер медленно, т.к. таблица engine_page большая, и explain этого запроса показывает что постгрес делает Seq Scan по engine_page.

Нафига он его делает если там уник индекс? Что можно попробовать?

★★★★★

Последнее исправление: pi11 (всего исправлений: 1)

Видимо планировщик запросов решил что этот индекс не эффективен, можно покурить explain запроса что бы планировщик рассказал почему он так решил, можно явно указать постгресу юзать индекс но обычно планировщик оказывается прав.

TDrive ★★★★★
()
              INNER JOIN engine_videoinfo b ON b.video_id=a.id
                WHERE NOT EXISTS
                    (SELECT 1
                       FROM engine_page c
                      WHERE c.url=b.external_url)

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

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Похоже там много дубликатов поля url в обоих таблицах, и ему приходится много данных фигачить. Если отключить seq scan ещё медленнее получается. Ок, буду думать как переделать, спасибо.

pi11 ★★★★★
() автор топика

Мне кажется, что игнорирует из-за сортировки. А еще может инструкция LIMIT сбивать планировщик с толку.

dicos ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.