특정 조건을 만족하는 데이터가 있는지 존재유무만 확인하려고 할 때,
보통 COUNT(*)를 통해 건수가 0 초과 인지 확인하는 로직을 생각했다.
의미있는 성능의 차이를 확인하기위해 아래처럼 약 200만건정도의 더미데이터가 있는 테이블로 예제를 진행해보겠다.
1 2 3 | /*데이터 확인*/ SELECT COUNT(*) CNT FROM BOOK_EX.TBL_BOARD; | cs |
먼저 count(*)를 이용한 쿼리를 확인해보자
1 2 3 4 | /*데이터 확인*/ SELECT COUNT(*) CNT FROM TBL_BOARD WHERE BNO >= 5 | cs |
0.231초 소요됐다. BNO가 5이상인걸 모두 SCAN한다음에 카운트한 결과를 리턴하게된다. 따라서 TBL_BOARD의 건수가 많을수록 성능저하가 발생할 수 있다.
EXISTS쿼리를 이용한다면 아래 쿼리처럼 구성할 수 있다.
1 2 3 4 5 6 7 | SELECT 1 AS CNT /*EXISTS는 만족하는게 한 건이라도 있으면 스캔을 멈춘다.*/ FROM DUAL WHERE EXISTS (SELECT 1 FROM TBL_BOARD WHERE BNO >= 5) ; | cs |
0.002초로 약 100배정도 성능향상이 있다. EXISTS는 서브쿼리내에서 WHERE조건절을 만족하는 행이 하나라도 발견되면 스캔을 멈추고 TRUE를 반환하게 된다. 따라서 TBL_BOARD의 건수가 아무리 많더라도 비교적 빠르게 존재유무를 판단할 수 있다.
'데이터베이스 > Oracle' 카테고리의 다른 글
[Oracle] 테이블명으로 Select쿼리문 자동생성 (0) | 2019.06.04 |
---|---|
오라클 계정생성 (0) | 2019.05.08 |
Java 코드, Oracle stored procedure의 성능 비교 (1) | 2016.05.24 |
Oracle cursor (0) | 2016.05.12 |
Oracle Stored Procedure (0) | 2016.05.12 |