IN | OR |
---|---|
SELECT * FROM TAB1 WHERE COL IN ( '1','5','7') AND COL2 = '111'; | SELECT * FROM TAB1 WHERE (COL1 ='1' OR COL1 ='5' OR COL1 ='7') AND COL2 = '111'; |
2) OR \-> IN(불가능)
OR |
---|
SELECT * FROM TAB1 WHERE ( COL1 ='1' OR COL2 = '500' OR COL2LIKE '7%' ) AND COL2 = '111'; |
처리주관 조건에 확실히 속하지 않는다면 OR 연산자는 오히려 수행속도에 도움을 준다.
(처리주관 범위는 '좁을수록' 유리하고 체크조건은 '넓을수록' 유리하다.)
1. OR의 실행계획
SELECT *
FROM TAB1
WHERE A LIKE 'S%' OR B = '1';
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=2 Bytes=520)
CONCATENATION
TABLE ACCESS (BY INDEX ROWID) OF 'TAB1' (TABLE) (Cost=1 Card=1 Bytes=260)
INDEX (RANGE SCAN) OF 'TAB1_B' (INDEX) (Cost=1 Card=1)
TABLE ACCESS (BY INDEX ROWID) OF 'TAB1' (TABLE) (Cost=1 Card=1 Bytes=260)
INDEX (RANGE SCAN) OF 'TAB1_A' (INDEX) (Cost=2 Card=1)
2. IN의 실행계획
SELECT *
FROM TAB1
WHERE A IN ('5', '1');
SELECT STATEMENT
CONCATENATION
TABLE ACCESS (BY INDEX ROWID) OF 'TAB1'
INDEX (RANGE SCAN) OF 'TAB1_A' (NON-UNIQUE)
TABLE ACCESS (BY INDEX ROWID) OF 'TAB1'
INDEX (RANGE SCAN) OF 'TAB1_A' (NON-UNIQUE)
OR 연산자 사용시 유의 사항
SELECT SUBSTR(매출일,1,6), SUM(매출액)
SUM(손익액),
SUM(손익액)/SUM(매출액)*100
FROM 매출순익
WHERE ( :IN_CUST <> '101' AND 거래처코드 = :IN_CUST AND 매출일 LIKE 'INDATE||%')
OR ( :IN_CUST ='101' AND RTRIM(거래처코드) = :IN_CUST AND 매출일 LIKE :IN_DATE||'%')
바인딩 변수(:IN_CUST)가 사용된 SQL문장을 파싱할 때는 변수인 상태로 실행계획을 수립하고 실행되는 순간 입력된 상수값을 바인딩하여 실행한다.
그러므로 옵티마이저는 어떤 입력값이 들어오든 하나의 실행계획, 즉 '전체 테이블 스캔'이 된다.(인덱스 사용은 전체 테이블 스캔의 진부분집합이다.)
SELECT SUBSTR(매출일,1,6), SUM(매출액),
SUM(손익액),
SUM(손익액)/SUM(매출액)*100
FROM 매출순익
WHERE :IN_CUST <> '101'
AND 거래처보드 = :IN_CUST
AND 매출일 LIKE IN_DATE||'%'
UNION ALL
SELECT SUBSTR(매출일,1,6), SUM(매출액),
SUM(손익액),
SUM(손익액)/SUM(매출액)*100
FROM 매출순익
WHERE :IN_CUST = '101'
AND RTRIM(거래처보드) = :IN_CUST
AND 매출일 LIKE IN_DATE||'%'
SELECT CHULNO, CUSTNO, CHULDATE, UNCOST
FROM CHULGOT
WHERE ( :SW = 1 AND ( STATUS LIKE '1%' OR STATUS LIKE '2%') )
OR ( :SW = 2 AND ( STATUS LIKE '3%'))
ORDER BY STATUS ;
SELECT CHULNO, CUSTNO, CHULDATE, UNCOST
FROM CHULGOT
WHERE STATUS LIKE DECODE(:SW,1,'2%')
OR STATUS LIKE DECODE(:SW,1,'1%','3%') ;
CONCATENATION
TABLE ACCESS BY ROWID CHULGOT
INDEX (RANGE SCAN) STATUS_INDEX
TABLE ACCESS BY ROWID CHULGOT
INDEX (RANGE SCAN) STATUS_INDEX
SLEECT ...
FROM HCMT_010 ..
WHERE ( 투입일시 LIKE :V_DATE||'%'
OR 출고일시 LIKE :V_DATE||'%'
OR 입문일시 LIKE :V_DATE||'%'
OR 출문일시 LIKE :V_DATE||'%'
OR ... )
AND 생산라인 = :V_LINE
SLEECT ...
FROM HCMT_010 ㅌ, ADDED_TABLE y
WHERE x.차대번호 = y.차대번호
and x.발생일시 LIKE :V_DATE||'%'
and y.생산라인 = :v_line;
AND 생산라인 = :V_LINE
=> 데이터 모델링 단계에에 실시하는 컬럼 하나의 정의도 미래에 발생할 활용도와 액세스 효율을 고려하여 선정하여야 할 것이다.