2014-01-05 6 views
0

Я пытаюсь настроить SQL-запрос с предложением IN в запросе.Настройка SQL-запроса (оптимизация запроса)

Я попытался заменить IN на Join и посмотрел планы запроса. Они выглядят похожими во время исполнения, но результат отличается. Кто-нибудь может помочь мне в этом? Я использую базу данных магазина в pgadmin III. Спасибо заранее. ORIGINAL ЗАПРОСА:

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

в

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

Редакцией: НАСТОЯЩИЙ запрос возвращает корректные результаты:

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

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

+2

настройка производительности ** весьма конкретного производителя ** - мы должны знать, какие конкретные ** базы данных ** (и какой версии) вы используете. SQL - это просто язык запросов, используемый подавляющим большинством реляционных систем баз данных. –

+0

@marc_s - это база данных магазина, и я использую его в pgadmin III. –

+1

Просьба показать структуры таблиц, включая индексы и планы запросов. –

ответ

2
SELECT pe.id 
FROM SHOP.person pe 
WHERE EXISTS (
    SELECT *  
    FROM SHOP.contactperson cp 
    WHERE cp.personid = pe.id 
    AND cp.companyid = 5 
    ); 
+0

Я проверил планы выполнения вашего предлагаемого запроса и запроса, предложенные Darhazer, они идентичны. В какой ситуации этот запрос может работать лучше, чем другое решение, предложенное Darhazer ??? –

+0

Они разные. Если существует связь 1: N между человеком и контактным лицом (что я ожидаю, но вы не так называли нам datamodel), запрос Дархазера даст более одной строки на человека, а мой ровно один. – wildplasser

1

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

SELECT person.id 
FROM SHOP.person 
Join SHOP.contactperson 
ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5; 
+2

Это может по-прежнему возвращать разные результаты, если 'contactperson.personid' не уникален. –