0

私が欲しいのは、1 つのイベントの参加者 (参加者の役割を持つ人々) と、参加者と同じ会社のマネージャーの役​​割を持つ人々を組み合わせたものです。

個人の役割は person_role_membership に保存されますが、個人の会社は People に保存されます。次のクエリを作成しましたが、これはかなりうまく機能すると思います。余分な結合と情報は無視してください。すべての参加者をフェッチしてから、すべてのマネージャーと UNION を実行します。そのために、もう一度すべての参加者をフェッチします。ここで問題になるのは、このクエリ全体です。小さなサブセットに 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))
4

1 に答える 1

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」ステートメントにより、データベースはすべてのレコードについて PEOPLE テーブル全体を調べます。

于 2012-06-11T12:59:05.543 に答える