select * from LP회원 where 회원번호 in (01')
select * from LP회원 where 회원번호 in (01', '02')
select * from LP회원 where 회원번호 in (01', '03')
select * from LP회원 where 회원번호 in (01', '02', '03')
select * from LP회원 where 회원번호 in (02')
select * from LP회원 where 회원번호 in (02', '03')
select * from LP회원 where 회원번호 in (03')
select * from LP회원 where 회원번호 in ( :a, :b, :c )
select * from LP회원
where 회원번호 in ( decode(:a, 'all', '01', :b)
, decode(:a, 'all', '02', :c)
, decode(:a, 'all', '03', :d)
)
select * from 수시공시내역
where 공시일자 = :일자
and :inlist like '%' || 분류코드 || '%'
:inlist := '01,03,08,14,17,24,33,46,48,53'
select * from 수시공시내역
where 공시일자 = :일자
and INSTR(:inlist, 분류코드) > 0
1. IN-List를 사용할 때
select * from 수시공시내역
where 공시일자 = :일자
and 분류코드 in ( ... )
2. like 또는 instr 함수를 사용할 때
select * from 수시공시내역
where 공시일자 = :일자
and INSTR(:inlist, 분류코드) > 0
select /*+ ordered use_nl(B) */ B.*
from ( select 분류코드
from 수시공시분류
where INSTR(:inlist, 분류코드) > 0 ) A
, 수시공시내역 B
where B.분류코드 = A.분류코드
select /*+ ordered use_nl(B) */ B.*
from ( select substr(:inlist, (rownum-1)*2+1, 2))
from 수시공시분류
where rownum <= length(:inlist) / 2) A
, 수시공시내역 B
where B.분류코드 = A.분류코드
:inlist := '01030814172433464853'
01
03
08
14
17
24
33
46
48
53
select /*+ ordered use_nl(B) */ B.*
from (select substr(:inlist, (level-1)*2+1, 2)
from dual
connect by level <= length(:inlist) / 2) A
, 수시공시내역 B
where B.분류코드 = A.분류코드
select 회원번호, SUM(체결건수), SUM(체결수량), SUM(거래대금)
from 일별거래실적 e
where 거래일자 = :trd_dd
and 시장구분 = '유가'
and exists (
select 'x'
from 종목
where 종목코드 = e.종목코드
and 코스피종목편입여부 = 'Y'
)
group by 회원번호
select 회원번호, SUM(체결건수), SUM(체결수량), SUM(거래대금)
from 일별거래실적 e
where 거래일자 = :trd_dd
and 시장구분 = '유가'
and exists (
select 'x'
from 종목
where 종목코드 = e.종목코드
and 코스피종목편입여부 = decode(:check_yn, 'Y', 'Y', 코스피종목편입여부)
)
group by 회원번호
:trd_dd := '20071228' :check_yn := 'N' Call Count CPU Time Elapsed Time Disk Query Current Rows --------- ----------- ------------ --------------- -------- -------- --------- ----------- Parse 1 0.000 0.000 0 0 0 0 Execute 1 0.000 0.000 0 0 0 0 Fetch 264 0.000 0.000 0 8518 0 2623 --------- ----------- ------------ --------------- -------- -------- --------- ----------- Total 266 0.000 0.000 0 8518 0 2623 Rows Row Source Operation ------ ------------------------------------------------ 0 STATEMENT 2623 FILETER (cr=8518 pr=0 pw=0 time=36781 us) 2627 PARTITION RANGE SINGLE PARTITION: 20 20 (cr=641 pr=0 pw=0 time=10547 us) 2627 TABLE ACCESS BY LOCAL INDEX ROWID 일별거래실적 PARTITION: 20 20 (cr=641 ...) 2627 INDEX RANGE SCAN 일별거래실적 X01 PARTITION: 20 20 (cr=274 pr=0 ...) 2623 TABLE ACCESS BY INDEX ROWID 종목 (cr=7877 pr=0 pw=0 time=25166 us) 2623 INDEX RANGE SCAN 종목_PK (cr=5254 pr=0 pw=0 time=16450 us) (Object ID 79702)
:trd_dd := '20071228' :check_yn := 'Y' Call Count CPU Time Elapsed Time Disk Query Current Rows --------- ----------- ------------ --------------- -------- -------- --------- ----------- Parse 1 0.000 0.000 0 0 0 0 Execute 1 0.000 0.000 0 0 0 0 Fetch 85 0.020 0.000 0 8208 0 839 --------- ----------- ------------ --------------- -------- -------- --------- ----------- Total 87 0.020 0.000 0 8208 0 839 Rows Row Source Operation ------ ------------------------------------------------ 0 STATEMENT 839 FILETER (cr=8208 pr=0 pw=0 time=13410 us) 2627 PARTITION RANGE SINGLE PARTITION: 20 20 (cr=293 pr=0 pw=0 time=5296 us) 2627 TABLE ACCESS BY LOCAL INDEX ROWID 일별거래실적 PARTITION: 20 20 (cr=293 ...) 2627 INDEX RANGE SCAN 일별거래실적 X01 PARTITION: 20 20 (cr=97 pr=0 ...) 839 TABLE ACCESS BY INDEX ROWID 종목 (cr=7915 pr=0 pw=0 time=27118 us) 2623 INDEX RANGE SCAN 종목_PK (cr=5292 pr=0 pw=0 time=18069 us) (Object ID 79702)
select 회원번호, SUM(체결건수), SUM(체결수량), SUM(거래대금)
from 일별거래실적 e
where 거래일자 = :trd_dd
and 시장구분 = '유가'
and exists (
select 'x' from dual where :check_yn = 'N'
union all
select 'x'
from 종목
where 종목코드 = e.종목코드
and 코스피종목편입여부 = 'Y'
and :check_yn = 'Y'
)
group by 회원번호
:trd_dd := '20071228' :check_yn := 'N' Call Count CPU Time Elapsed Time Disk Query Current Rows --------- ----------- ------------ --------------- -------- -------- --------- ----------- Parse 1 0.000 0.000 0 0 0 0 Execute 1 0.000 0.000 0 0 0 0 Fetch 264 0.000 0.000 0 641 0 2627 --------- ----------- ------------ --------------- -------- -------- --------- ----------- Total 266 0.000 0.000 0 641 0 2627 Rows Row Source Operation ------ ------------------------------------------------ 0 STATEMENT 2627 FILTER (cr=641 pr=0 pw=0 time=18443 us) 2627 PARTITION RANGE SINGLE PARTITION: 20 20 (cr=641 pr=0 pw=0 time=7924 us) 2627 TABLE ACCESS BY LOCAL INDEX ROWID 일별거래실적 PARTITION:20 20 (cr=641 ...) 2627 INDEX RANGE SCAN 일별거래실적_X01 PARTITION: 20 20 (cr=274 pr=0 ...) 2627 UNION-ALL (cr=0 pr=0 pw=0 time=9061 us) 2627 FILTER (cr=0 pr=0 pw=0 time=4659 us) 2627 FAST DUAL (cr=0 pr=0 pw=0 time=1874 us) 0 TABLE ACCESS BY INDEX ROWID 종목 (cr=0 pr=0 pw=0 time=0 us) 0 INDEX RANGE SCAN 종목_PK (cr=0 pr=0 pw=0 time=0 us)(Object ID 79702)
:trd_dd := '20071228' :check_yn := 'Y' Call Count CPU Time Elapsed Time Disk Query Current Rows --------- ----------- ------------ --------------- -------- -------- --------- ----------- Parse 1 0.000 0.000 0 0 0 0 Execute 1 0.000 0.000 0 0 0 0 Fetch 85 0.040 0.053 0 8208 0 839 --------- ----------- ------------ --------------- -------- -------- --------- ----------- Total 87 0.040 0.053 0 8208 0 839 Rows Row Source Operation ------ ------------------------------------------------ 0 STATEMENT 839 FILTER (cr=8208 pr=0 pw=0 time=15177 us) 2627 PARTITION RANGE SINGLE PARTITION: 20 20 (cr=293 pr=0 pw=0 time=7919 us) 2627 TABLE ACCESS BY LOCAL INDEX ROWID 일별거래실적 PARTITION:20 20 (cr=293 ...) 2627 INDEX RANGE SCAN 일별거래실적_X01 PARTITION: 20 20 (cr=97 pr=0 pw=0 ...) 839 UNION-ALL (cr=0 pr=0 pw=0 time=36922 us) 0 FILTER (cr=0 pr=0 pw=0 time=1817 us) 0 FAST DUAL (cr=0 pr=0 pw=0 time=0 us) 839 TABLE ACCESS BY INDEX ROWID 종목 (cr=7915 pr=0 pw=0 time=26760 us) 2623 INDEX RANGE SCAN 종목_PK (cr=5292 pr=0 pw=0 time=17769 us)
* 이것을 Static SQL로 바꾸는 것은 너무 쉽습니다. decode 함수 또는 case 구문을 활용하면 됩니다.
/* 1 : 평균 2: 합계 */
decode(:gubun, '1', avg(계약수), sum(계약수)),
decode(:gubun, '1', avg(계약금액), sum(계약금액)),
decode(:gubun, '1', avg(미결재약정금액), sum(미결재약정금액)),
h3. (5) 연산자가 바뀌는 경우
* 조건절에 사용되는 입력항목이나 출력항목이 바뀌는 게 아니라 그림 4-18처럼 비교 연산자가 그때그때 달라지는 경우는 어떻게 Static SQL로 구현할 수 있을까요? !Scan0006.jpg|align=left!
* 미만, 이하, 이상, 초과, 중 사용자가 선택하는 항목이 무엇이냐에 따라 <, <=, >, >= 4가지 중 하나의 연산자로 바꿔야 하므로 Dynamic SQL이 불가피하다고 생각할 수 있습니다. 하지만 누구나 조금만 고민해 보면 쉽게 해법을 찾을 수 있습니다. 아래처럼 SQL을 작성하고 바인딩하는 값을 바꾸면 됩니다.
where 거래미형성률 between :min1 and :max1
and 일평균거래량 between :min2 and :max2
and 일평균거래대금 between :min3 and :max3
and 호가스프레드비율 between :min4 and :max4
and 가격연속성 between :min5 and :max5
and 시장심도 between :min6 and :max6
and 거래체결률 between :min7 and :max7
* 각 컬럼은 아래와 같은 도메인에 따라 표준화된 데이터 타입과 자릿수를 할당받습니다.
* || 도메인 \\ || 데이터 타입 \\ ||
| 거래량 \\ | NUMBER(9) \\ |
| 거래대금 \\ | NUMBER(15) \\ |
| 가격연속성 \\ | NUMBER(5, 2) \\ |
| ...... \\ | ...... \\ |
* 일평균거래량을 예로 들면, 거래량 도메인은 9자리 숫자형이고 정수 값만 허용하므로 입력 가능한 최소값은 0, 최대값은 999,999,999입니다. 따라서 사용자가 1000주를 입력하여 사용자가 선택한 비교 연산자에 따라 아래와 같이 Between 시작값과 종료값을 바인딩 하면 됩니다.
* || 구분 || between 시작값(:min3) \\ || between 종료값(:min3) \\ ||
| 이하 \\ | 0 \\ | 1000 \\ |
| 미만 \\ | 0 \\ | 999 \\ |
| 이상 \\ | 1000 \\ | 999999999 \\ |
| 초과 \\ | 1001 \\ | 999999999 \\ |
* 정수형이 아니 가격연속성을 하나 더 예로 들면, 가격연속성 도메인은 소수점 이하 2자리를 갖는 총 5자리 숫자형이므로 입력 가능한 최소값은 0.00, 최대값은 999,99입니다. 따라서 사용자가 50%를 입력하면 사용자가 선택한 비교 연산자에 따라 아래와 같이 Between 시작값과 종료값을 바인딩하면 됩니다.
* || 구분 \\ || between 시작값(:min5) || between 종료값(:min5) ||
| 이하 \\ | 0.00 \\ | 50.00 \\ |
| 미만 \\ | 0.00 \\ | 49.99 \\ |
| 이상 \\ | 50.00 \\ | 999.99 \\ |
| 초과 \\ | 50.01 \\ | 999.99 \\ |
h3.
h3. 참조 문서
이 자료는 ([오라클 성능 고도화 원리와해법 I|http://book.daum.net/detail/book.do?bookid=KOR9788996246015])을 참고 하여 작성했습니다.