h1.10. DYNAMIC SQL 사용 기준
h2.(1) Dynamic SQL 사용에 관한 기본 원칙
h2.(2) 기본 원칙이 잘 지켜지지 않는 첫 번째 이유, 선택적 검색 조건
검색 조건이 다양해 사용자 선택에 따라 조건절이 동적으로 바뀌는 경우
Select 거래일자, 종목코드, 투자자유형?, 주문매체코드, 체결건수, 체결수량, 거래대금
From 일별종목거래
Where 거래일자 between :시작일자 and :종료일자
And 종목코드 = nvl(:종목코드, 종목코드)
And 투자자유형코드 = nvl(:투자자유형코드, 투자자유형코드)
And 주문매체구분코드 = nvl(:주문매체구분코드, 주문매체구분코드)
h2.(3) 선택적 검색 조건에 대한 현실적인 대안
h2.(4) 선택적 검색 조건에 사용할 수 있는 기법 성능 비교
h4.A. OR 조건을 사용하는 경우
Select * from 일별종목거래
Whre (:isu_cd is null or isu_cd = :isu_cd )
Execution Plan
-------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS
1 0 TABLE ACCESS (FULL) OF '일별종목거래' (TABLE)
- 항상 Table Full Scan 으로 처리되므로 인덱스 활용이 필요할 때는 이 방식을 사용해선 안된다.
h4.B. LIKE 연산자를 사용하는 경우
SELECT * FROM 일별종목거래
WHRE isu_cd like :isu_cd ||'%'
Execution Plan
-------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS
1 0 TABLE ACCES ( BY LOCAL INDEX ROWID ) OF '일별종목거래' (TABLE)
2 1 INDEX (RANGE SCAN) OF '일별종목거래_PK' ( INDEX ( UNIQUE))
h4.C. NVL 함수를 사용하는 경우
SELECT * FROM 일별종목거래
WHERE isu_cd = nvl(;isud_cd, isu_cd)
Execution Plan
-------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS
1 0 CONCATENATION
2 1 FILTER
3 2 TABLE ACCESS (FULL) OF '일별종목거래' (TABLE)
4 1 FILTER
5 4 TABLE ACCES ( BY LOCAL INDEX ROWID ) OF '일별종목거래' (TABLE)
6 5 INDEX (RANGE SCAN) OF '일별종목거래_PK' ( INDEX ( UNIQUE))
h4.D. DECODE 함수를 사용하는 경우
SELECT * FROM 일별종목거래
WHERE isu_cd = decode(:isu_cd, null, isu_cd :isu_cd)
Execution Plan
-------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS
1 0 CONCATENATION
2 1 FILTER
3 2 TABLE ACCESS (FULL) OF '일별종목거래' (TABLE)
4 1 FILTER
5 4 TABLE ACCES ( BY LOCAL INDEX ROWID ) OF '일별종목거래' (TABLE)
6 5 INDEX (RANGE SCAN) OF '일별종목거래_PK' ( INDEX ( UNIQUE))
SQL> select * from dual where NULL = NULL
선택된 레코드가 없습니다.
SQL> select * from dual where NULL IS NULL
DU
--
X
1 개의 행이 선택되었습니다.
h4.E. union all 을 사용하는 경우
SELECT * FROM 일별종목거래
WHERE :isu_cd is null
UNION ALL
SELECT * FROM 일별종목거래
WHERE :isu_cd is not null
AND isu_cd = :isu_cd
Execution Plan
-------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS
1 0 UNION-ALL
2 1 FILTER
3 2 TABLE ACCESS (FULL) OF '일별종목거래' (TABLE)
4 1 FILTER
5 4 TABLE ACCES ( BY LOCAL INDEX ROWID ) OF '일별종목거래' (TABLE)
6 5 INDEX (RANGE SCAN) OF '일별종목거래_PK' ( INDEX ( UNIQUE))