✅ 바인딩 조건 형태와 선택도
- 1~4번은 선택(Selectivity)를 5%로 계산하고, 5~8번까지는 0.25%로 계산한다.
번호 조건절 번호 조건절 1 번호 > :no 5 번호 between :no1 and :no2 2 번호 < :no 6 번호 > :no1 and 번호 <= :no2 3 번호 >= :no 7 번호 >= :no1 and 번호 < :no2 4 번호 <= :no 8 번호 > :no1 and 번호 < :no2
- 예를 들어 테이블에 1,000개 로우가 있다면 옵티마이저는 1~4번 조건절에 대해서는 50개 로우가 출력될 것으로 예상하고, 5~8번 조건절에 대해서는 약 3개의 로우가 출력될 것으로 예상한다.
테이블 생성
CREATE TABLE t
AS SELECT ROWNUM no FROM dual CONNECT BY LEVEL <= 1000 ;
테이블 분석
ANALYZE TABLE t COMPUTE STATISTICS FOR TABLE FOR ALL COLUMNS;
테이블 해석
EXPLAIN PLAN FOR SELECT * FROM t WHERE no <= :no;
첫번째 조회 및 조회 결과
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null, null, 'basic rows'));
===========================================
Plan hash value: 1601196873
------------------------------------------
| Id | Operation | Name | Rows |
------------------------------------------
| 0 | SELECT STATEMENT | | 50 |
| 1 | TABLE ACCESS FULL| T | 50 |
------------------------------------------
===========================================
테이블 생성
CREATE TABLE t
AS SELECT ROWNUM no FROM dual CONNECT BY LEVEL <= 1000 ;
테이블 분석
ANALYZE TABLE t COMPUTE STATISTICS FOR TABLE FOR ALL COLUMNS;
테이블 해석
EXPLAIN PLAN FOR SELECT * FROM t WHERE no BETWEEN :no1 AND :no2;
두번째 조회 및 조회 결과
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null, null, 'basic rows'));
===========================================
Plan hash value: 1322348184
-------------------------------------------
| Id | Operation | Name | Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | 3 |
| 1 | FILTER | | |
| 2 | TABLE ACCESS FULL| T | 3 |
-------------------------------------------
===========================================
CREATE TABLE t
AS SELECT ROWNUM no FROM dual CONNECT BY LEVEL <= 1000 ;
ANALYZE TABLE t COMPUTE STATISTICS FOR TABLE FOR ALL COLUMNS;
EXPLAIN PLAN FOR SELECT * FROM t WHERE no <= 100;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null, null, 'basic rows'));
===========================================
Plan hash value: 1601196873
------------------------------------------
| Id | Operation | Name | Rows |
------------------------------------------
| 0 | SELECT STATEMENT | | 99 |
| 1 | TABLE ACCESS FULL| T | 99 |
------------------------------------------
===========================================
CREATE TABLE t
AS SELECT ROWNUM no FROM dual CONNECT BY LEVEL <= 1000 ;
ANALYZE TABLE t COMPUTE STATISTICS FOR TABLE FOR ALL COLUMNS;
EXPLAIN PLAN FOR SELECT * FROM t WHERE no BETWEEN 500 AND 600;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null, null, 'basic rows'));
===========================================
Plan hash value: 1601196873
-----------------------------------------
| Id | Operation | Name | Rows |
-----------------------------------------
| 0 | SELECT STATEMENT | | 98 |
| 1 | TABLE ACCESS FULL | T | 98 |
-----------------------------------------
===========================================
Parameter Sniffing
이라 한다.SELECT * FROM 아파트매물 WHERE 도시 = :City;
✅ Peeking 기능 비 활성화
ALTER SYSTEM SET "_optim_peek_user_binds" = FALSE;