-- STATIC ( 집계 )
select id
, stand_date
, rnum
from TB_STATIC
index1( stand_date )
index2( id, stand_date )
-----------------------------
-- SYSTEM ( 시스템 )
select id
, parent_id
from TB_SYSTEM
pk : id ( PK )
index3( parent_id)
=========================================
테이블이 위와 같이 두개로 구성되어 있습니다.
tb_static 에 2개월치 데이터를 조회합니다.
select count(*)
from TB_STATIC
where 1=1
and stand_date between to_date(to_char(sysdate-61, 'yyyymmdd')||'000000', 'yyyymmddhh24miss') and to_date(to_char(sysdate, 'yyyymmdd')||'235959', 'yyyymmddhh24miss')
-- 결과 건수 : 1,724,587 건
----------------------------------------
select * from TB_SYSTEM
where parent_id = '1001'
-- 결과 건수 : 400 건
----------------------------
select /*+INDEX(TB_STATIC index2)*/
count(*) over() cnt
, a.id
, to_char(a.stand_date, 'yyyymmdd')
--, max(a.rnum) value <-------- (1)
from TB_STATIC a
, TB_SYSTEM b
where a.id = b.id
and b.parent_id = '1001'
and a.stand_date between to_date(to_char(sysdate-61, 'yyyymmdd')||'000000', 'yyyymmddhh24miss') and to_date(to_char(sysdate, 'yyyymmdd')||'235959', 'yyyymmddhh24miss')
group by a.id, to_char(stand_date, 'yyyymmdd')
-- 결과 건수 : 6,200 건( 20 ~ 30 초 )
===================================
위와 같이 6,200 건을 가져오는데 20 초 넘게 걸립니다.
더욱이 <---- (1) 주석을 풀면 30초 이상이 걸립니다.
속도를 개선하려면 어떻게 해야 하나요?
참 플렌을 떠보면 TB_SYSTEM의 index3을 먼저 타고 TB_STATIC 의 index2 를 탑니다.
|