java function을 이용한 Query 수행속도 문의

by 김상윤 posted Mar 26, 2013


안녕하세요

문의글을 자주 남기게 됩니다. ^^;


SQL 수행속도 관련하여 문의드리고자 글을 남깁니다.

요약하면 

단일 Query로 수행할 경우 0.005 초의 속도가 나오는데

UNCHK_EVENT_BY_AGENT_N 라는 함수로 만들어서 해당 쿼리를 40번 호출하게 되면 속도가 2초 이상 걸리게 됩니다.

단순 산술적으로도 0.2초 정도 걸려야 정상인거 같은데요.

호출 횟수가 증가할수록 조회속도도 기하급수적으로 증가합니다.

왜 이런 현상이 발생하는지가 질문의 요지입니다.


혹시나 하여 동일한 조건에서 Oracle에서 테스트한 결과

Query를 40번 호출하더라도 0.2초 정도밖에 걸리지 않습니다.


1. 정상적으로 수행되는 단일 Query (정상조회됨 0.5초)

 select case when CHECK_DATE is not null then -99 else TO_NUMBER(ifnull(FLAG, '-1')) END AS t_flag 

 from  

 ( SELECT /*+ USE_DESC_IDX(tbl_nic_info_crdate)*/a.FLAG, a.CHECK_DATE 

from tbl_nic_info a 

where a.AGENT_ID = '00032' 

 and (a.FLAG in ('0', '9') or (a.FLAG = '1' and ( (ifnull(a.BEFORE_IP, ' ') <> ifnull(a.AFTER_IP, ' ')) 

                          or (ifnull(a.BEFORE_MAC, ' ') <> ifnull(a.AFTER_MAC, ' ') )))) 

and a.CHECK_DATE IS NULL 

ORDER BY  a.COLLECT_DATE desc        

 ) x  

 where ROWNUM = 1 ;




2. (1)번을 함수로 만들어서 함수를 호출하는 Query (속도에 문제가 발생)

select

UNCHK_EVENT_BY_AGENT_N(yy.AGENT_ID, 'OS') AS OS_EVT_TYPE

from 

(

SELECT al.agent_id

FROM TBL_AGENT_LISTS al  left outer JOIN  

(SELECT oi.agent_id, oi.AFTER_COMPUTER_NAME          

FROM TBL_OS_INFO oi, TBL_LATEST_GETDATE lg          

WHERE oi.agent_id = lg.AGENT_ID AND lg.LOG_TYPE = '1001'  AND oi.COLLECT_DATE = lg.COLLECT_DATE )

        oi ON al.AGENT_ID = oi.agent_id 

WHERE delete_yn = 'N' AND lower(NVL(al.DEPT_NAME, ' ')) LIKE lower('%%') AND lower(NVL(al.USER_NAME, ' '))

        LIKE lower('%%') AND lower(NVL(al.agent_id, ' ')) LIKE lower('%%')

AND lower(NVL(oi.AFTER_COMPUTER_NAME, ' ')) LIKE lower('%%')AND lower(NVL(al.ipaddress, ' ')) 

        LIKE lower('%%')  

ORDER BY al.USER_NAME

) yy




3. (2)번의 UNCHK_EVENT_BY_AGENT_N 함수를 정의한 Java 파일은 별도 첨부

TBL_AGENT_LISTS 에 데이터 40건이 있어, 해당함수가 40번 호출 됨