60만건데이터를 select하는데 dcode, grouping, substr, group by rollup, having, orderby, sum이 다들어가서
약 8천건 정도 데이터를 가져옵니다. 매번 쿼리 수행하면 시간이 오래 걸려서
뷰로 해보니 속도 향상이 전혀 없네요 create table as select~ 하니 속도가 2배 향상되긴 했습니다.
여기서 의문인게 60만건을 수많은 함수 거쳐서 뽑아내는거랑 그 결과값을 테이블로 저장해서 단순 select하는게
생각보다 속도 차이가 크지 않네요.
정적인 데이터를 가장빨리 뽑는 방법이 무엇이 있을까요?
view는 미리정의한 sql일 뿐 물리적 실체가 없습니다.
--view 정의
create view v_sampleview
as
select 어쩌고저쩌고
--사용
select * from vsampleview -> vsampleview 부분이 위에 정의한 쿼리로 대체된다고 생각하시면 됩니다.
그래서 view를 만들었다고 해서 빨라질 수는 없는 거고요.
60만건을 grouping 하면 무슨 방법을 써도 느릴 수 밖에 없습니다.
그래서 아래 댓글에 집계 테이블을 만들고 월마다 집계하여 데이터를 미리 넣어두시라 한 겁니다.
예를들어
같은 월에 같은 이름으로 1000건 정도 쌓이는 경우
집계 테이블을 아래와 같이 만들고
create table 집계테이블
(
이름 varchar2(20),
년월 varchar2(6),
금액 number
)
11월 마지막 날에
insert into 집계테이블
(이름, 년월, 금액)
select 이름, '201711', sum(금액)
from 원테이블
where 날짜 between '20171101' and '20171130'
group by 이름
이런식으로 데이터를 넣어놓는다면
60만건을 읽을 필요 없이 소량의 데이터만 읽어도 원하시는 정보를 얻을 수 있겠죠.
12월이 끝나지 않은 상태에서 12월 현재까지의 총계를 보려면
select 이름, sum(금액)
from
(
select 이름, 금액
from 집계테이블
union all
select 이름, 금액
from 원테이블
where 날짜 between '20171201' and '20171231'
)
group by 이름
이렇게 하면 되겠죠.
월마다 이름 별로 건수가 적다면 아예 년도별로 관리하셔도 될 거구요.