본문 바로가기

데이터베이스/Oracle

Java 코드, Oracle stored procedure의 성능 비교


테스트 상황

Apriori 알고리즘을 구현하며 lift를 계산하는 것은, 

A->B 라는 규칙이 있을 때 '신뢰도(A,B)/ 지지도(B)' 가 1보다 큰 규칙은 살리고 아닌 것들은 삭제하는 것이나,
현재 생성된 규칙들의 대부분이 lift가 1보다 컸다. 따라서 성능결과 차이를 극대화 시키기 위해 1보다 큰 규칙들을 삭제하는 로직으로 테스트를 진행했다.
  


상황 1. 

Java 코드상에서 쿼리를 여러번 DB로 날려서 수행해야하는 경우
( 수행되는 여러개의 쿼리가 트랜잭션 로직 단위 이므로 All or Nothing 으로 처리되어야 한다.)



상황 2.

Oracle의 procedure로 트랜잭션 로직 단위의 쿼리를 작성하여, Java 코드상에서는 DB로 해당 stored procedure를 한 번만
호출 하면 되는 경우.




수행 결과

DB에 있는 더미 데이터가 총 80개 였으므로, 상황 1의 경우 DB로 쿼리를 80번 날린 셈이 되고, 상황 2의 경우 DB로 쿼리를 1번 날린 셈이 된다. 즉  쿼리 한번 수행에 0.05초 정도가 소요됬다는 결과를 얻을 수 있고 수행되는 쿼리의 수나 DB의 더미데이터가 더 많아지면 이 성능 차이는 더 커질 것이라는 결론을 내릴 수 있다.

상황 1의 경우  

상황 2의 경우       으로 평균적으로 약 10배의 성능차이가 난다. 


이는 상황 1의 경우 lift가 1 보다 큰 경우 마다 java에서 DB로 쿼리를 날리게 되고 DB에서는 쿼리의 구문 분석 후 처리하여 결과를 DB에 반영하게 되므로 오버헤드가 크게 발생한다.

반면에, 상황 2의 경우 프로시저는 최초에 한 번 구문 분석이 되고 DB의 서버에 저장되어있기 때문에 추가적인 오버헤드가 없어지고, java에서 해당 프로시저를 실행하는 쿼리를 단 한 번만 DB에 날리면 되기 때문에 네트웍 트래픽이 현저히 감소하게 된다.

따라서 트랜잭션 로직 단위의 쿼리의 경우 procedure를 이용하여 작성하면 보안이나 속도 측면에서 이점을 볼 수 있게 된다. 










'데이터베이스 > Oracle' 카테고리의 다른 글

[오라클] EXISTS 활용 예제  (0) 2019.05.10
오라클 계정생성  (0) 2019.05.08
Oracle cursor  (0) 2016.05.12
Oracle Stored Procedure  (0) 2016.05.12
게시판 페이징 처리 (oracle DB)  (6) 2016.03.04