<대용량데이터베이스 솔루션1 5page 그림참고>
1.2 인덱스의 적용원칙
![]() |
인덱스가 사용되지 않는 경우
|
SELECT dept, ename FROM emp WHERE SUBSTR(job, 1, 4)='SALE' |
SELECT dept, ename FROM emp WHERE job LIKE 'SALE%' |
SELECT dept, ename FROM emp WHERE sal*12 = 100000 |
SELECT dept, ename FROM emp WHERE sal = 100000/12 |
SELECT dept, ename FROM emp WHERE NVL(job, 'X') = 'SALE' |
SELECT dept, ename FROM emp WHERE job = 'SALE' |
SELECT custno, chuldate FROM chulgot WHERE custno = 'DN01' AND status = '90' |
SELECT custno, chuldate FROM chulgot WHERE custno = 'DN01' AND RTRIM(status) = '90' |
=> ORD_DATE LIKE '9502%'를 만족하는 로우수가 ORD_DEPT = '12345'를 만족하는 로우 수보다 적다고 가정 했을 경우..
SELECT x.ordno, x.ord_date, y.item, y.ordqty FROM ORDER1T x, ORDER2T y WHERE x.ordno = y.ordno AND x.ord_date LIKE '9502%' AND y.orddept = '12345' ORDER BY ord_date |
SELECT x.ordno, x.ord_date, y.item, y.ordqty FROM ORDER1T x, ORDER2T y WHERE x.ordno = y.ordno AND x.ord_date LIKE '9502%' AND RTRIM(y.orddept = '12345') ORDER BY ord_date |
=> sale_dept 가 95년도인 데이터가 아주 많고, sale_dept로 생성된 인덱스가 있다고 가정 했을 경우..
SELECT sal_no, sale_date, sale_dept, saleqty FROM mechult WHERE sale_date LIKE '95%' ORDER BY sale_dept |
SELECT sal_no, sale_date, sale_dept, saleqty FROM mechult WHERE RTRIM(sale_date) LIKE '95%' AND sale_dept > '' |
SELECT chr,num,var,dat FROM samplet WHERE chr = 10 |
SELECT chr,num,var,dat FROM samplet WHERE chr = '10' |
=> 문자타입을 숫자와 비교: 숫자로 변형.
=> 숫자타입을 문자와 비교: 형변환 없음.(단, like '10%'와 같이 비교하는 경우 문자로 형변환 됨)
SELECT 'Not found' FROM EMP WHERE EMPNO <> 7369 |
SELECT 'NOT FOUND' FROM DUAL WHERE NOT EXISTS ( SELECT 'X' FROM EMP WHERE EMPNO = 7369 ) |
SELECT 'Not found' FROM emp a WHERE NOT EXISTS (SELECT empno FROM emp b WHERE b.empno = 7369 AND a.empno = b.empno) |
=> TAB1테이블의 'YYYYMM','COL1'가 각각 인덱스로 생성되어 있고 TAB2의 'YYYYMM','COL2'가 각각 인덱스로 생성되어 있다
1) SELECT * FROM TAB1 WHERE YYYYMM = '199910' FROM TAB2AND NOT EXISTS ( SELECT * WHERE COL2 = COL1 AND YYYYMM = '199910') |
2) SELECT * FROM TAB1 WHERE YYYYMM ='199910' AND COL1 NOT IN (SELECT COL2 FROM TAB2 WHERE YYYYMM = '199910') |
3) SELECT * FROM TAB1 WHERE (YYYYMM, COL1) IN (SELECT '199910', COL1 FROM TAB1 WHERE YYYYMM = '199910' MINUS SELECT '199910', COL2 FROM TAB2 WHERE YYYYMM = '199910') |
1) 과 2) 에서의 sub쿼리는 나중에 수행되거나 check조건으로 수행된다.
3) 인 경우엔 서브쿼리에서 MINUS결과를 먼저 수행하고, 그 결과를 가지고 메인쿼리를 엑세스 한다.
각각 테이블에 'YYYYMM+COL1','YYYYMM+COL2'로 구성된 인덱스가 있다면 테이블을 엑세스 하지 않고 인덱스만 가지고 sort merge방식으로 서브쿼리를 먼저 수행한 후 처리된 서브쿼리의 결과로 메인쿼리의 조건으로 사용한다.
SELECT * FROM emp WHERE ename IS NOT NULL |
SELECT * FROM emp WHERE ename > '' |
SELECT * FROM emp WHERE empno IS NOT NULL |
SELECT * FROM emp WHERE empno > 0 |
SELECT * FROM emp WHERE ename IS NULL |
CREATE TABLE emp( ename VARCHAR2(20) DEFAULT '00' ...... ) |
SELECT ord_dept, SUM(ordqty), AVG(ordqty+asnqty), AVG(ordqty) FROM ORDER WHERE status < 'C' GROUP BY ord_dept
![]() |
NULL 공포증의 해소 방안 '확정은 되었으나 값이 없다' 경우에는 문자 타입일 때는 ' '(Space)나 기타 문자를 필요에 따라 지정하고, 숫자 타입일 때는 0 을 지정한다. |
SELECT ord_dept, ordqty FROM ORDER1T WHERE status = 'C' AND ord_date like '9502%'
SELECT ord_dept, ordqty FROM ORDER1T WHERE status = 'C' AND ord_date = '950201'
SELECT ord_dept, ordqty FROM ORDER1T WHERE ord_dept like '12%' AND ord_date like '9502%'
![]() |
범위 처리가 넓다고 할 수 있는 'LIKE', 'BETWEEN', '<', '>'등과 같이 사용될 경우 결코 인덱스 머지를 하지 않고 어느 하나의 인덱스만 사용하고 나머지는 포기한다. |
SELECT * FROM emp WHERE ename > 'A'
![]() |
힌트의 사용 방법 /*+ */ : 힌트의 내용을 여러 라인에 걸쳐서 기술할 수 있음. |
![]() |
ORACLE_Hint 정리 |