2015-05-21 3 views
1

Как оптимизировать этот запрос, чтобы получить тот же результат, не так долго? Подзапрос NOT IN занимает очень много времени.НЕ ВХОД В ЗАПИСЬ занимает слишком много времени, чтобы выполнить

SELECT DISTINCT EmployeeId FROM employees 
    WHERE 
    status = 'Active' 
    && BranchId = '2' 
    && NOT EXISTS (
     SELECT * FROM attendance 
     WHERE 
     employees.EmployeeId = attendance.EmployeeId 
     && attendance.AttendanceDate = '2015-01-20' 
    ) 
) 

SELECT EmployeeId FROM employees 
    WHERE 
    status = 'Active' 
    && BranchId = '2' 
    && NOT IN (
     SELECT EmployeeId FROM attendance WHERE AttendanceDate='2015-01-20' 
    ) 

ответ

0

Вот еще один вариант запроса

select 
distinct e.EmployeeId FROM employees e 
left join attendance a on e.EmployeeId = a.EmployeeId and a.AttendanceDate = '2015-01-20' 
where 
e.status='Active' 
and e.BranchId= '2' 
and a.EmployeeId is null 

Вам также потребуется некоторые показатели, которые должны применяться на столах, как

alter table employees add index st_br_idx(status,BranchId); 
alter table AttendanceDate add index AttendanceDate_idx(AttendanceDate); 

если EmployeeID не является внешним ключом, то нет необходимости для добавления индекса else, если индекс еще не существует, вам может понадобиться следующее:

alter table AttendanceDate add index EmployeeId_idx(EmployeeId); 

Если EmployeeId является первичным ключом в employees, то его уже проиндексированы, если и не индексируются вам может понадобиться добавить индекс для этого, а также

alter table employees add index EmployeeId_idx(EmployeeId); 

Вы также можете проверить свой исходный запрос после того, как выше показателей

SELECT DISTINCT e.EmployeeId FROM employees e 
WHERE 
e.status='Active' 
and e.BranchId= '2' 
and NOT EXISTS (
    SELECT 1 FROM 
    attendance a WHERE e.EmployeeId = a.EmployeeId 
    and a.AttendanceDate='2015-01-20' 
) 

для анализа использования запроса explain select.. и посмотреть, как оптимизатор использует индексы и возможное число строк, оптимизатор может сканировать для извлечения записей

+0

Спасибо большое .. –

+0

Добро пожаловать! –