Можно ли объединить мой вариант использования в один запрос, не влияя на производительность? - PullRequest
2 голосов
/ 06 января 2011

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

Включено 2 таблицы:

Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)

Мое требование: я хочу получить / извлечь все записи из таблицы EMPLOYEE с условием, что в email1 или email2 нет соответствующей записи в таблице EMAILLIST. Проще говоря, если в таблице EMAILLIST совпадает email1 или email2, эти записи следует игнорировать.

В этом случае EMPLOYEE.EMAIL1, EMPLOYEE.EMAIL2 и EMAILLIST.EMAIL будут всегда иметь один сохраненный адрес электронной почты.

Мы используем PostgreSQL v8.2.3, если это имеет значение.

Любые указатели / идеи / логика приветствуются.

ОБНОВЛЕНИЕ: В настоящее время мы реализовали это следующим образом: извлекли все записи из таблицы EMPLOYEE и сохранили их в объекте Java и для каждой записи (для цикла), это, в свою очередь, проверяет таблицу EMAILLIST, что дорого с точки зрения производительности.

Ответы [ 2 ]

1 голос
/ 06 января 2011

Есть три способа справиться с этим

LEFT JOIN

SELECT *
FROM employee AS e
LEFT JOIN emaillist AS em 
ON e.email1 = em.email
   or e.Email2 = em.email
 WHERE
     em.email is null

НЕ СУЩЕСТВУЕТ

SELECT *
FROM employee AS e
WHERE
   NOT EXISTS (SELECT * 
               FROM  
                 emaillist AS em 
              WHERE e.email1 = em.email
                  or e.email2 = em.Email)

НЕ В

SELECT *
FROM employee AS e
WHERE
    e.email1 NOT IN (SELECT email
               FROM  
                 emaillist)
    and
     e.email2 NOT IN (SELECT email
               FROM  
                 emaillist)
1 голос
/ 06 января 2011

Самый эффективный способ справиться с этим для всех rdbms, с которыми я имел дело, это обработать его с помощью внешних объединений:

SELECT whatever
FROM employee AS e
LEFT JOIN emaillist AS em1 ON e.email1 = em1.email
LEFT JOIN emaillist AS em2 ON e.email2 = em2.email
WHERE em1.id IS NULL
    AND em2.id IS NULL

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...