Настройка SQL-запроса (оптимизация запроса)

Я пытаюсь настроить SQL-запрос, в котором есть предложение IN.

Я попытался заменить IN на Join и посмотрел планы запросов. Оба варианта похожи по времени выполнения, но результат отличается. Может ли кто-нибудь помочь мне в этом? Я использую базу данных магазина в pgadmin III. Заранее спасибо. ОРИГИНАЛЬНЫЙ ЗАПРОС:

SELECT person.id
FROM   SHOP.person
WHERE  person.id IN (SELECT personid
                     FROM   SHOP.contactperson
                     WHERE  companyid = 5); 

to

SELECT person.id
FROM   SHOP.person
       JOIN SHOP.contactperson
         ON person.id = contactperson.id
WHERE  contactperson.companyid = 5; 

EDITED: ТЕПЕРЬ ЭТОТ ЗАПРОС ВОЗВРАЩАЕТ ПРАВИЛЬНЫЕ РЕЗУЛЬТАТЫ:

SELECT person.id
FROM   SHOP.person
       JOIN SHOP.contactperson
         ON person.id = contactperson.personid
WHERE  contactperson.companyid = 5;

Я использовал contactperson.id вместо contactperson.id, и когда я изменил его на правильный запрос, он дал мне правильные результаты.


person S. N    schedule 05.01.2014    source источник
comment
Настройка производительности в значительной степени зависит от поставщика — нам нужно знать, какую конкретную базу данных (и какую версию) вы используете. SQL — это всего лишь язык запросов, используемый подавляющим большинством систем реляционных баз данных…   -  person marc_s    schedule 05.01.2014
comment
@marc_s — это база данных магазина, и я использую ее в pgadmin III.   -  person S. N    schedule 05.01.2014
comment
Пожалуйста, покажите структуры ваших таблиц, включая индексы и планы запросов.   -  person Martin Smith    schedule 05.01.2014
comment
@MartinSmith спасибо, теперь все работает отлично.   -  person S. N    schedule 05.01.2014
comment
Это заметил Дархазер. Не я!   -  person Martin Smith    schedule 05.01.2014


Ответы (2)


В вашем предложении соединения не используются те же поля, что и в исходном запросе. Вы должны использовать personid из таблицы контактных лиц.

SELECT person.id
FROM SHOP.person 
Join SHOP.contactperson
ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5;
person Maxim Krizhanovsky    schedule 05.01.2014
comment
Это может по-прежнему возвращать разные результаты, если contactperson.personid не уникален. - person Martin Smith; 05.01.2014

person    schedule
comment
Я проверил планы выполнения для предложенного вами запроса и запроса, предложенного Дархазером, они идентичны. В какой ситуации этот запрос может работать лучше, чем другое решение, предложенное Darhazer??? - person M.Ali; 05.01.2014
comment
Они разные. Если между человеком и контактным лицом существует отношение 1:N (что я ожидаю, но вы не сообщили нам модель данных), запрос Дархазера даст более одной строки на человека, а мой ровно одну. - person wildplasser; 05.01.2014