2016-09-06 2 views
0

에 절을 여러 부속 선택을 최적화 : 나는 쿼리의 실행 계획을 보면내가 같은 쿼리가 오라클

select 
    qsn.code, 
    (select prs.display_name from prs where prs.id = qsn.fk_prs) display_name, 
    (select prs.address from prs where prs.id = qsn.fk_prs) address, 
    (select prs.tel from prs where prs.id = qsn.fk_prs) tel 
from 
    qsn 
where 
    qsn.register_date between :x1 and :x2 

를, 그것은 prs 테이블 3 회 (INDEX UNIQUE SCAN를 사용하여 각 시간)을 조회합니다. 내가 한 번 절을 를 사용하여 prs 테이블을 조회 할 수있는 경우

내가 궁금해? 어떻게 그런 식으로 쿼리를 작성할 수 있습니까?

각 테이블에 수백만 개의 레코드가 있으므로 이들을 조인하면 쿼리가 너무 느려집니다.

+0

실행 계획을 보지 않고서는 쉽게 추측 할 수 있습니다. 두 쿼리 모두에 대해 [실행 계획] (http://stackoverflow.com/questions/34975406/how-to-describe-performance-issue-in-relational-database?answertab=active#tab-top)을 게시하십시오 (하위 쿼리 및 조인과 함께). 당신의 관찰에 대한 한 가지 설명은 해쉬 조인 (두 테이블 모두에서 가능한 FTS 사용)으로 전환한다는 것인데, 다른 설명은 스칼라 하위 쿼리 캐싱에서 이익을 얻는 것입니다 (상대적으로 적은 수의 qsn.fk_prs가 있음). –

답변

1

쿼리는 다음과 같이 간다 절을 사용하여 :

with abc as (select id, 
        display_name , 
        address , 
        tel 
       from prs) 
select 
    qsn.code, 
    abc.display_name, 
    abc.address, 
    abc.tel 
from qsn 
inner join abc 
on qsn.fk_prs = abc.id 
where qsn.register_date between :x1 and :x2 ; 

PS : 테스트하지.

1

사용 조인 :

select qsn.code, prs.display_name, prs.address, prs.tel 
from qsn 
left join prs on prs.id = qsn.fk_prs 
where qsn.register_date between :x1 and :x2 
+0

내가 그 (것)들을 결합 할 때 나가 언급 한대로, 질문 실행 시간은 더 나쁘게된다! –

+0

@AmirPashazadeh -'prs.id'뿐만 아니라'qsn.fk_prs'에 대한 색인이 있습니까? 그렇지 않으면 추가하고 도움이되는지 확인하십시오. – mathguy

+0

예 인덱스가 있지만'id','display_name','address' 및'tel'를 조합 한 인덱스는 없습니다. 나는 항상 ANSI JOINS를 사용하지만 쿼리 비용은 (설명 플랜을 사용하여 41000에서 64000으로) 증가합니다. –