У меня есть две таблицы: A
и P
. Я хочу получить информацию обо всех строках в A
, чей идентификатор находится во временной таблице, которую я создал, tmp_ids
. Однако в таблице P
есть дополнительная информация о A
, foo
, и я хочу получить и эту информацию. У меня есть следующий запрос:
SELECT A.H_id AS hid,
A.id AS aid,
P.foo, A.pos, A.size
FROM tmp_ids, P, A
WHERE tmp_ids.id = A.H_id
AND P.id = A.P_id
Я заметил, что это происходит медленно, и когда я попросил Postgres объяснить, я заметил, что он объединяет tmp_ids
с индексом A
, который я создал для H_id
, с вложенным циклом. Однако он хэширует все P
перед выполнением хэш-соединения с результатом первого слияния. P
довольно большой, и я думаю, что это то, что занимает все время. Зачем ему создавать там хэш? P.id
является первичным ключом P
, а A.P_id
имеет собственный индекс.
ОБНОВЛЕНИЕ: Все типы данных — INTEGER, кроме A.size
, который является ДВОЙНОЙ ТОЧНОСТЬЮ, и P.foo
, который является VARCHAR. Я использую PostgreSQL версии 8.4.
Вот объяснение: http://explain.depesz.com/s/WBo.