У меня есть тихий простой запрос:Низкая производительность Postgres с пунктом
SELECT
contract.ctrId,
contract.ctrNr
FROM
changeLog,
contract
where
changelog.entid in (select contract.ctrid from contract where contract.ctrnr LIKE '1000002%');
Этот запрос занимает 800 мс.
Если изменить запрос с внутренним выбором пункта в результате выбора (который представляет собой одно число)
SELECT
contract.ctrId,
contract.ctrNr
FROM
changeLog,
contract
where
changelog.entid in (100000001611624);
Этого запрос занимает всего 16 мс.
Выполненный внутренний выбор занимает 4 мс.
Chnagelog.entid имеет индекс. Contract.ctris id - первичный ключ. Таблица контрактов имеет всего 2 строки, таблица изменений имеет около 40 тысяч.
Тем не менее, я действительно не могу обдумать это. В чем может быть проблема с выбором inners?
Вы просматривали/сравнивали планы запросов? – jpmc26
Вопросы о производительности требуют правильной информации. Пожалуйста, ознакомьтесь с инструкциями в информации тега для [postgresql-performance]. –
Прежде чем беспокоиться о производительности, я думаю, вы должны исправить свой запрос. Вы не указали условие соединения, поэтому вы получаете декартовое соединение ... каждая запись в контракте соединяется с каждой записью в changeLog. Это не может быть большой проблемой в этом конкретном случае, поскольку контракт имеет только 2 записи, но в целом это плохая практика (если только это не преднамеренно). –