본문 바로가기

기록/SQL

[ORACLE] 조건절 부등호 검색 비교

SMALL

https://okky.kr/articles/436919

 

OKKY - 오라클 조건절 부등호사용할때 속도문의

테이블 A가 있습니다A테이블의 날짜가 들어있는 한컬럼에 10년치 데이터를 가져오려고 조회조건이 걸려있는상태입니다.그래서 튜닝을 해보려고 이것저것만져보다가 조건타입을 바꿔봤는데 속

okky.kr

오라클 환경에서 쿼리를 조회할때 조건절에 NOT IN과 부등호를 사용하는 방법 중 고민하게 됐다.

NOT IN은 OUTER JOIN을 사용해서 null이 많을 때 효과적이라 부등호를 사용하게 되었다.

 

처음 작성한 쿼리는 다음과 같다.

SELECT T1.COLUMN
FROM TBL1 T1, TBL T2
WHERE 1 = 1
-- 추가 조건
AND T1.COLUMN2 > '100'
;

COLUMN2는 VARCHAR(20)의 컬럼이다.

이 컬럼을 특정 값보다 큰 값으로 결과값을 얻기 위해 쿼리를 작성했다.

해당 쿼리는 실행하는데 4.95초가 걸렸다.

 

그래서 다음과 같이 쿼리를 변경했다.

SELECT T1.COLUMN
FROM TBL1 T1, TBL T2
WHERE 1 = 1
-- 추가 조건
AND T1.COLUMN2 > 100 -- NUMBER 타입
;

변경한 부분은 조건절 비교문에서 문자열을 숫자로 변경한 것이다.

이렇게 변경하고 나서 쿼리를 실행하면 평균 3초가 걸렸다.

데이터가 많으면 더 확실한 차이를 보일 것 같다.

 

그리고 이유를 찾다가 위에서 참고한 페이지의 답변을 읽게 되었다.

SQL엔진은 통상 한쪽이 char이고 한 쪽이 숫자로 파악이 되면 묵시적 형변환을 통해 속도가더 빠른 숫자로 좌우를 맞춰서 파싱을 하는데 전자의 경우 사람 눈에는 똑같아 보이지만 SQL 파서가 읽기에는 대소비교연산자가 나오고 좌우변 타입이 char이니 양쪽에 형변환이 필요한 셈이고 후자는 좌변만 형변환 후 메모리에 올리면 되니 시간이 절약되겠지요.

즉, SQL엔진은 비교 처리시간이 빠른 숫자형식으로 묵시적 형변환을 사용해서 기존 쿼리에서는 양 변을 형변환하는 시간이 걸렸지만, 두번째 쿼리에서는 기존 컬럼인 문자열 컬럼만 형변환을 진행하여 형변환 속도를 단축시킨 점이다.

비교하는 양 변의 컬럼 타입이 다르면 형변환을 하는 것은 알았지만 둘 다 문자열인데도 숫자로 형변환 한다는 사실은 처음알았다. 

메모.

SMALL