Вопросы производительности при использовании подзапросов - PullRequest
1 голос
/ 11 января 2012

Скажите, у меня есть две таблицы ниже

 ------------------------------
|           employee           |
 ------------------------------
| employee_id  | employee_name |  
 ------------------------------
|     1        |     one       |
|     2        |     two       |
|     3        |     three     |
 ------------------------------

и

 -------------------------------------------
|                feedback                   |
 -------------------------------------------
| employee_id (FK)  |       comments        |  
 -------------------------------------------
|         2         |     comment two       |
 -------------------------------------------

Каков наилучший (с точки зрения производительности) способ получения информации обо всех сотрудниках, у которых нет обратной связи?

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

SELECT * FROM employee WHERE employee_id NOT IN (SELECT employee_id FROM feedback)

База данных - Oracle, и все ключевые столбцы имеют индексы.

Обновление

Спасибо всем, хотелось бы принять более одного ответа! Это то, что я использовал в конце (структура моей таблицы была не такой простой, как показано здесь, поскольку у меня были объединения с несколькими другими таблицами).

SELECT 
    e.name, m.name, a.postcode 
FROM 
    employee LEFT OUTER JOIN feedback f on (e.employee_id = f.employee_id),
    address a, manager m 
WHERE a.address_id = e.address_id
AND m.manager_id = e.manager_id
AND f.employee_id IS NULL

Ответы [ 4 ]

4 голосов
/ 11 января 2012

Вы можете использовать:

SELECT e.* 
  FROM employee e 
  LEFT OUTER JOIN feedback f ON (e.employee_id = f.employee_id)
 WHERE f.employee_id IS NULL 

Что должно быть довольно хорошо. Я предполагаю, что столбцы EMPLOYEE_ID проиндексированы ...

Попробуйте и посмотрите, как выглядит ваш план объяснения.

РЕДАКТИРОВАТЬ: Как вы уже сказали, у вас нет таблицы PLAN, тогда эта статья Тома Кайта (Oracle VP) полезна: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:313616750808

Это предполагает обоснование того, почему каждое решение (NOT IN, NOT EXISTS, OUTER JOIN) может быть лучше в данных обстоятельствах.

Есть также это от плодовитого Дона Берлесона: http://www.dba -oracle.com / oracle_tips_subq_rewrite.htm

2 голосов
/ 11 января 2012

Лучший способ убедиться в этом - попробовать каждый метод с соответствующими данными - я предлагаю использовать not exists:

select * from EMPLOYEE e 
where not exists
(select null from FEEDBACK f where e.EMPLOYEE_ID = f.EMPLOYEE_ID)
2 голосов
/ 11 января 2012

Попробуйте использовать разные запросы и сравнить их планы. Еще одна возможность реализовать свой запрос:

select EMPLOYEE_ID from employee
MINUS
select EMPLOYEE_ID from FEEDBACK
2 голосов
/ 11 января 2012

Возможно:

SELECT e.* FROM EMPLOYEE e
LEFT OUTER JOIN FEEDBACK f ON e.EMPLOYEE_ID = f.EMPLOYEE_ID
WHERE f.EMPLOYEE_ID IS NULL

Но вы можете прочитать ЭТУ статью об этом!

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