1 | 번호 > : NO | 5 | 번호 between :NO and :NO |
2 | 번호 < : NO | 6 | 번호 > :NO and 번호 <= :NO2 |
3 | 번호 >= : NO | 7 | 번호 >= :NO and 번호 < :NO2 |
4 | 번호 <= : NO | 8 | 번호 > :NO and 번호 < :NO2 |
카디널리티 = 선택도 + 전체 레코드 수
4, 5번으로 테스트
SQL> create table t as
2 select rownum no from dual connect by level <= 1000;
테이블이 생성되었습니다.
SQL> analyze table t compute statistics for table for all columns;
테이블이 분석되었습니다.
SQL> explain plan for
2 select * from t where no <= :NO;
해석되었습니다.
SQL> select * from table
2 (dbms_xplan.display(null,null,'basic rows'));
------------------------------------------
| Id | Operation | Name | Rows |
------------------------------------------
| 0 | SELECT STATEMENT | | 50 |
| 1 | TABLE ACCESS FULL| T | 50 |
------------------------------------------
SQL> explain plan for
2 select * from t where no between :no1 and :no2;
해석되었습니다.
SQL> select * from table
2 (dbms_xplan.display(null,null,'basic rows'));
-------------------------------------------
| Id | Operation | Name | Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | 3 |
| 1 | FILTER | | |
| 2 | TABLE ACCESS FULL| T | 3 |
-------------------------------------------
SQL> explain plan for
2 select * from t where no <= 100;
해석되었습니다.
-상수 조건식 ( no <=100, no between 500 and 600)
SQL> select * from table
SQL> select * from table
2 (dbms_xplan.display(null,null,'basic rows'));
------------------------------------------
| Id | Operation | Name | Rows |
------------------------------------------
| 0 | SELECT STATEMENT | | 99 |
| 1 | TABLE ACCESS FULL| T | 99 |
------------------------------------------
SQL> explain plan for
2 select * from t where no between 500 and 600;
해석되었습니다.
SQL> select * from table
2 (dbms_xplan.display(null,null,'basic rows'));
------------------------------------------
| Id | Operation | Name | Rows |
------------------------------------------
| 0 | SELECT STATEMENT | | 99 |
| 1 | TABLE ACCESS FULL| T | 99 |
------------------------------------------
위 테스트 결과로
바인드 변수는 정해진 계산식으로 비용을 계산.
파티션테이블을 쿼리할 땐 파티션 레벨 통계정보를 이용하지못함.
파티션보다 부정확한 테이블 레벨 통계를 이용해 악성 실행계획을 수립,
1) dbms_stats 패키지의 기본 설정으로 히스토그램을 생성 여부를 오라클에서 판단
SQL> alter system set "_optim_peek_user_binds" = false; <-- 비활성화
SQL> alter system set "_optim_peek_user_binds" = true; <-- 활성화
시스템이 변경되었습니다.
SQL> select * from v$ses_optimizer_env
2 where sid =userenv('sid')
3 and name like '_optim_peek%';
SID ID NAME ISD VALUE
---------- ---------- ---------------------------------------- --- -------------------------
146 98 _optim_peek_user_binds NO false
SELECT /*+ FULL(a) */ *
FROM 아파트매물 a
WHERE :CITY IN ('서울시', '경기도')
AND 도시 = :CITY
UNION ALL
SELECT /*+ INDEX(a idx01) */ *
FROM 아파트매물 a
WHERE :CITY NOT IN ('서울시', '경기도')
AND 도시 = :CITY;
IF :CITY IN ('서울시', '경기도') THEN
SELECT /*+ FULL(a) */ *
FROM 아파트매물 a
WHERE 도시 = :CITY;
ELSE
SELECT /*+ INDEX(a idx01) */ *
FROM 아파트매물 a
WHERE 도시 = :CITY;
END IF;
- 강좌 URL : http://www.gurubee.net/lecture/3101
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.