01. Database

[SQL][Oracle] 엑셀다운로드 시간 단축했던 법 공유

devamy 2024. 6. 20. 09:58

현업에서 유지보수 업무를 하다가

고객사로부터 4만건이 넘는 데이터를 엑셀로 다운받을 때

6분 30초 정도 걸리는 등의 이유로 업무에 지장이 간다는 민원을 접수했다.

 

엑셀로 데이터를 불러올 때 결국 select 쿼리문을 쓰므로, 쿼리문만 수정하면 될 것 같았다.

 

우선, 3개월 단위로 조회하면 더 빨라지지 않을까 하여 'BETWEEN 조건'을 걸었다.

6분 30초에서 2분 30초로 단축되었다. 

데이터를 일부만 조회하니 시간이 자연스럽게 단축될 수 밖에 없었다.

 

하지만, 여기서 더 줄일 수 없을까 고민했고, 회사 선임님께 도움을 구했다.

 

그리고 서브쿼리문 하나만 수정했더니

2분 30초에서 20초로 단축되었다.

 

여기서부터 이 포스팅에서 공유하고 싶은 이야기이다.

무려 약 2분을 단축했던 방법이다.

간단하게 말해, 서브 쿼리문은 SELECT 문을 단순 CASE 문으로 변경하였더니 시간이 단축되었다.

 

상세설명


- 조회하는 테이블과 조인 관계가 BEFORE와 AFTER 모두 같다.

- 그런데 BEFORE에는 서브 쿼리문에서 이미 FROM 으로 가져온 TABLE_2를 재사용한다.

- 단순 CASE문으로 바꾸고, TABLE_2에서 바로 원하는 examplecd 값을 가져온다. 즉, B.examplecd로 바꾼다.

 

 

BEFORE)

SELECT 
	A.COL1,
    A.COL2,
    A.COL3,
    A.COL4,
    A.COL5,
    A.COL6,
    A.COL7,
    A.COL8,
    , (
        SELECT 
        CASE 
            when examplecd = '001' then 'RESULT_A'
            when examplecd = '002' then 'RESULT_B'
            when examplecd = '003' then 'RESULT_C'
            when examplecd = '004' then 'RESULT_D'
            when examplecd = '005' then 'RESULT_E'
            when examplecd = '006' then 'RESULT_F'
            when examplecd = '007' then 'RESULT_G'
            when examplecd = '008' then 'RESULT_H'
            when examplecd = '009' then 'RESULT_I'
            when examplecd = '010' then 'RESULT_J'
            when examplecd = '011' then 'RESULT_K'
            when examplecd = '012' then 'RESULT_L'
            when examplecd = '013' then 'RESULT_M'
            when examplecd = '014' then 'RESULT_N'
            when examplecd = '015' then 'RESULT_0'
            when examplecd = '016' then 'RESULT_P'
            END
        FROM TABLE_2 WHERE COL1 = A.COL1
		  ) as RESULT_NAME     
FROM TABLE_1 A, TABLE_2 B, TABLE_3 C
WHERE A.COL2 = B.COL2 AND B.COL_3 = C.COL_3

 

AFTER)

단순 CASE 문으로 trimming.

SELECT 
	A.COL1,
    A.COL2,
    A.COL3,
    A.COL4,
    A.COL5,
    A.COL6,
    A.COL7,
    A.COL8,
    , 
        CASE 
            when B.examplecd = '001' then 'RESULT_A'
            when B.examplecd = '002' then 'RESULT_B'
            when B.examplecd = '003' then 'RESULT_C'
            when B.examplecd = '004' then 'RESULT_D'
            when B.examplecd = '005' then 'RESULT_E'
            when B.examplecd = '006' then 'RESULT_F'
            when B.examplecd = '007' then 'RESULT_G'
            when B.examplecd = '008' then 'RESULT_H'
            when B.examplecd = '009' then 'RESULT_I'
            when B.examplecd = '010' then 'RESULT_J'
            when B.examplecd = '011' then 'RESULT_K'
            when B.examplecd = '012' then 'RESULT_L'
            when B.examplecd = '013' then 'RESULT_M'
            when B.examplecd = '014' then 'RESULT_N'
            when B.examplecd = '015' then 'RESULT_0'
            when B.examplecd = '016' then 'RESULT_P' END as RESULT_NAME     
FROM TABLE_1 A, TABLE_2 B, TABLE_3 C
WHERE A.COL2 = B.COL2 AND B.COL_3 = C.COL_3