위 쿼리에서 order 테이블이 가장 크기가 크지만, orderdt 의 날짜가 2009년 이후인지만 체크하고 있다.
2009년 이후 모든 데이터를 가져와 중복제거를
->
원하는 데이터만 가져와 2009년 이후인지만 Exists
create index order_01 on order (prod_id, orderdt);
select /*+ leading(m p) use_nl(p) index(p idx_product_12_01)*/
p.m_code, m.m_name
from product_12 p, manuf_12 m
where p.m_code = m.m_code
and exists (
select /*+ nl_sj index(o oder_01) */ 'x'
from order_12 o
where o.orderdt >= '20090101'
and o.prod_10 = p.prod_id
)
group by p.m_code, m.m_name
위처럼 m 테이블 풀스캔,(50건) 을 상품테이블과 조인하고, (1: M 관계라서 나중에 group by 해줘야함)
조인된 상품을 주문테이블과 nl_sj 하여서, 2009년 이후인지만 체크한다.
(세미조인도 인덱스 필수)
select a.*
from (select a.*, rownum as ro
from (select *
from order o
where orderdt like :v_ordmon || '%'
order by orderdt, empid, case :v_orderbyCol
when 'ORDERPRIC' then orderpric
when 'ORDERQTY' then orderqty
END desc) a
where rownum <= :v_cpag * v_ppag) a
where ro > (:v_cpag -1) * v_ppag ;