개요
Tibero 데이터베이스에서는 SQL 질의 최적화를 위해 옵티마이저(Optimizer)가 조건절에 사용된 바인드 변수의 선택도를 계산하여 실행 계획을 수립합니다.
본 문서에서는 _OPT_BIND_PEEKING = N 설정 시 바인드 변수가 사용된 조건절에 대해 선택도가 어떻게 계산되는지를 연산자별로 분석하고, 실험 결과를 통해 실제 적용 방식을 확인합니다.
방법
바인드 변수와 선택도
바인드 변수는 SQL 질의의 조건절에서 런타임에 값이 주입되는 변수 입니다.
옵티마이저는 선택도 추정을 통해 어떤 접근 경로(인덱스 vs 테이블 스캔 등)를 사용할지를 결정합니다.
_OPT_BIND_PEEKING 파라미터
•
Y: 옵티마이저가 최초 실행 시 바인드 변수 값 참고
•
N: 바인드 변수의 값 미 사용 → 계산 로직 기반 추정
연산자별 선택도 계산 로직
연산자 | 선택도 계산 방식 | 설명 |
= | (total rows – nulls) / distinct count / total rows | 고유값 기반 추정 |
<> | 1 – 위의 = 조건 선택도 | = 연산자 선택도를 뺀값 |
>, >=, <, <= | _OPT_DFLT_INEQUAL_SELECTIVITY / 100000 | 기본값: 10000 → 선택도 0.1 |
복합 표현식 (:A + :B) | 상동 (기본 연산자 기준) | 바인드 값이 아닌 표현 구조 기반 판단 |
함수 또는 UDF 내부 | 경우에 따라 1 / distinct_count 사용 | 단순화된 논리 적용 가능성 있음 |
테스트 구성
테이블 및 통계 생성
CREATE TABLE cardt(c1 NUMBER);
INSERT INTO cardt SELECT level FROM dual CONNECT BY level < 1001; -- 총 1000행
COMMIT;
EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS','CARDT', METHOD_OPT=>'FOR ALL COLUMNS SIZE 255');
ALTER SESSION SET _OPT_BIND_PEEKING=N;
SQL
복사
테스트 결과 및 해석
단일 바인드 조건
질의 조건 | 예제 | 선택도 | 해석 |
= | SELECT * FROM cardt WHERE c1 = :A; | 0.001 | 1 / 1000 |
> | SELECT * FROM cardt WHERE c1 > :A; | 0.100 | 고정값 (10000 / 100000) |
>= | SELECT * FROM cardt WHERE c1 >= :A; | 0.100 | 동일 |
< | SELECT * FROM cardt WHERE c1 < :A; | 0.100 | 동일 |
<= | SELECT * FROM cardt WHERE c1 <= :A; | 0.100 | 동일 |
<> | SELECT * FROM cardt WHERE c1 <> :A; | 0.999 | 1 - 0.001 |
복합 표현식 조건
질의 조건 | 예제 | 선택도 | 해석 |
= | SELECT * FROM cardt WHERE c1 = :A + :B; | 0.001 | 기본 = 조건과 동일 계산 |
> | SELECT * FROM cardt WHERE c1 > :A + :B; | 0.100 | 고정값 |
<> | SELECT * FROM cardt WHERE c1 <> :A + :B; | 0.999 | 위와 동일 |
위 결과를 통해, 옵티마이저가 바인드 변수의 실제 값을 고려하지 않고 연산자 유형 및 통계 정보만을 이용해 선택도를 추정하고 있음을 알 수 있습니다.
Tibero에서 _OPT_BIND_PEEKING = N으로 설정된 경우, 바인드 변수의 값을 참조하지 않고 고정된 알고리즘에 의해 선택도를 계산합니다. 이로 인해, 복잡한 조건절 또는 복합 표현식이 사용되더라도 선택도 추정에는 동일한 기본 규칙이 적용됩니다.
사용자는 이 동작 방식을 이해하고 통계 정보(distinct count 등)를 주기적으로 관리함으로써 옵티마이저의 선택도 추정 정확도를 높일 수 있습니다.
참고
시스템 전역 또는 세션 단위로 _OPT_BIND_PEEKING 설정값을 상황에 맞게 조정합니다.
부등호 조건의 선택도를 조절하고자 할 경우 _OPT_DFLT_INEQUAL_SELECTIVITY 파라미터를 조정할 것을 고려합니다.
ALTER SESSION SET _OPT_DFLT_INEQUAL_SELECTIVITY = 5000; -- 선택도 0.05
SQL
복사
•
_OPT_BIND_PEEKING: 바인드 변수 값 참조 여부
•
_OPT_DFLT_INEQUAL_SELECTIVITY: 불등호 조건 기본 선택도 (기본값 10000 → 0.1)
•
DBMS_STATS: 통계 수집 패키지