안녕하세요
문의글을 자주 남기게 됩니다. ^^;
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번 호출 됨
아시다시피 CUBRID는 사용자 정의 함수/프로시져를 java 기반으로 제공하고 있습니다.
서버 프로세스가 구동되면서 java를 실행하기 위한 jvm이 함께 구동되어 지는데 아무래도 jvm에서 동작하는 관계로 자원을 나눠 사용하게 되어 성능상 이슈가 있습니다.
가능하시면 query로 처리하시거나 응용프로그램의 함수로 사용하시길 권장 드립니다.