2012-06-11 4 views
0

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

Роль человека заключается в хранении в person_role_membership, но компания человека хранится в People. Я разработал следующий запрос, который, я думаю, хорошо работает. Пожалуйста, проигнорируйте дополнительные соединения и информацию. Я собираю всех участников, затем СОЮЗ со всеми менеджерами, для которых я снова собираю всех участников. Теперь проблема заключается в этом целом запросе, поскольку небольшое подмножество занимает 9 секунд. Есть ли способ сделать это быстрее?

select distinct * 
from 
(
SELECT 
p.id as p_id, p.first_name as p_first_name, p.last_name as p_last_name,p_r.name as p_role, 
p.job_title as p_job_title, 
p_d.email as p_email, p_d.phone_1 as p_phone, p_d.phone_ext_1 as p_ext, 
c.name as p_company, p_c.name as p_parent_company 

FROM person_role_memberships as prm 

left join people as p on prm.person_id = p.id and prm.person_role_id between 32 and 35 
left join person_roles as p_r on p_r.id = prm.person_role_id 
left join person_details as p_d on p.id = p_d.person_id and p_d.type = 'BusinessDetail' 
left join companies as c on c.id = p.company_id 
left join companies as p_c on p_c.id = p.parent_company_id 

where 
p.id is not null 

) as parts 
union (

select p.id, p.first_name,p.last_name,prm.person_role_id, p.job_title, 'cp email', 'phone','ext',c.name, d.name 

from people as p -- All those people 

left join person_role_memberships as prm on prm.person_id = p.id -- whose roles are like this 
left join companies as c on p.company_id = c.id 
left join companies as d on c.parent_id = d.id 
-- and whose companies are like those people whose roles are like this 

where company_id = any 
(
select company_id from people as p 
left join person_role_memberships as prm on prm.person_id = p.id 
where prm.person_role_id between 32 and 35-- and other conditions; 
) 

and (person_role_id = 14 or person_role_id = 15)) 

ответ

0

Я предполагаю, что «любая» часть вашего запроса замедляет работу. Судя по ней, я думаю, что вы даже не нужно, потому что вы можете фильтровать по person_role_memberships непосредственно:

select p.id, p.first_name,p.last_name,prm.person_role_id, p.job_title, 'cp email', 'phone','ext',c.name, d.name 

from people as p -- All those people 
    left join person_role_memberships as prm on prm.person_id = p.id -- whose roles are like this 
    left join companies as c on p.company_id = c.id 
    left join companies as d on c.parent_id = d.id 

-- and whose companies are like those people whose roles are like this 
where prm.person_role_id between 32 and 35 -- and other conditions; 
    and (person_role_id = 14 or person_role_id = 15)) 

«any'-оператор вызывает базу данных, чтобы просмотреть весь НАРОД таблицы для каждой записи.

Смежные вопросы