SELECT * FROM EMP WHERE SUBSTR(TO_CHAR(EMP_NO), 1, 4) = '2012' ;
SELECT * FROM EMP WHERE EMP_NO != 20120902 ;
SELECT * FROM EMP WHERE DEPT_CD IS NOT NULL ;
원본 | 튜닝 방안 |
---|---|
select * from 업체 where substr(업체명, 1, 2) = '대한'; | select * from 업체 where 업체명 like '대한%' |
select * from 사원 where 월급여*12 = 36000000 | select * from 사원 where 월급여 = 36000000/12 |
select * from 주문 where to_char(일시, 'yyyymmdd')=:dt | select * from 주문 where 일시 >= to_date(:dt,'yyyymmdd') and 일시 < to_date(:dt, 'yyyymmdd') +1 |
원본 쿼리 | 묵시절 형 변환된 쿼리 |
---|---|
WHERE CHAR_COL = 20 | WHERE to_number(CHAR_COL) = 20 |
WHERE NUM_COL = '20' | Where NUM_COL = to_number('20') |
SQL) select * from 고객 where 지역 = '서울',
Execution Plan
o SELECT STATEMENT Optimizer=ALL_ROWS
1 0 TABLE ACCESS (BY INDEX ROWID) OF '고객' (TABLE)
2 1 INDEX (RANGE SCAN) OF '고객 지 역 IDX' (INDEX)
StmtText
1- - Nested Loops(Inner Join, OUTER REFERENCES '([Bmk1000]))
I--Index Seek(OBJECT:(L .l. [dboJ.[고객J.[고객-지역)dx]) , SEEK:([지역) = '서울')
I--RID Lookup(OBJECT:([ . .l. [dboJ. [고객]), SEEK:([Bmkl000)=[Bmkl000]) LOOKUP ORDERED FORWARD)
EMP_NO | ENAME | DEPTNO | JOB | SAL | HIRE_DT |
---|
select ename, job, sal
from emp
where deptno =30
and sal >= 3100
Call Count CPU Time Elapsed Time Disk Query Current Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse 1 0.000 0.002 0 0 0 0
Execute 1 0.000 0.000 0 0 0 0
Fetch 2 0.010 0.020 0 106 0 6
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total 4 0.010 0.022 0 106 0 6
Rows Row Source Operation
------- ---------------------------------------------------
0 STATEMENT
6 TABLE ACCESS BY INDEX ROWID EMP (cr=106 pr=0 pw=0 time=11766 us)
187 INDEX RANGE SCAN IND_EMP (cr=3 pr=0 pw=0 time=209 us)OF IND_EMP (NONUNIQUE)
Call Count CPU Time Elapsed Time Disk Query Current Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse 1 0.000 0.002 0 0 0 0
Execute 1 0.000 0.000 0 0 0 0
Fetch 2 0.000 0.002 0 9 0 6
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total 4 0.000 0.004 0 9 0 6
Rows Row Source Operation
------- ---------------------------------------------------
0 STATEMENT
6 TABLE ACCESS BY INDEX ROWID EMP (cr=9 pr=0 pw=0 time=957 us)
6 INDEX RANGE SCAN IND_EMP2 (cr=4 pr=0 pw=0 time=614 us)OF IND_EMP2 (NONUNIQUE)
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 2 0.000 0.001 0 5 0 6
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total 4 0.000 0.001 0 5 0 6
Rows Row Source Operation
------- ---------------------------------------------------
0 STATEMENT
6 INDEX RANGE SCAN IND_EMP3 (cr=5 pr=0 pw=0 time=908 us)OF IND_EMP3 (NONUNIQUE)
create index emp_x01 on emp (deptno) include (sal)
설명이 이미 많이 나왔으므로 Hash Cluster 에 대해서만
아래 쿼리에서
select 해당층, 평당가, 입력일, 해당동, 매물구분, 연사용일수, 중개업소코드
from 매물아파트매매
where 아파트시세코드 = 'A010101231241223'
and 평형 = 59
and 평형타임 = 'A'
and 인터넷매물 between 1 and 2
order by 입력일 desc
-> 인덱스 선행 컬럼이 = 조건이 되게 구성
-> 인덱스 구성을 바꿀 수 없을 때는 범위 조건을 In List 로 변환 가능한지 고려
select 해당층, 평당가, 입력일, 해당동, 매물구분, 연사용일수, 중개업소코드
from 매물아파트매매
where 아파트시세코드 = 'A010101231241223'
and 평형 = 59
and 평형타임 = 'A'
and 인터넷매물 in (1, 2)
order by 입력일 desc
----------------------------------------------------------------------
|Id | Operation | Name | Rows | Bytes |
----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 37 |
| 1 | INLIST ITERATOR | | | |
| 2 | TABLE ACCESS BY INDEX ROWID | 매물아파트매매 | 1 | 37 |
| 3 | INDEX RANGE SCAN | 매물아파트매매 PK | 1 | |
----------------------------------------------------------------------
'매물아파트매매 1 테이블. 스캔 수 2, 논리적 읽기 수 8, 물리적 읽기 수 0, 미리 읽기 수 O.
Rows StmtText
-------------------------------------------------------------------------------------
2 SELECT 해당층, 명당가, 입력일, 해당동, 매물구분, 연사용일수, 중개업소코드, ...
2 |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1000]))
2 |--Index Seek(OBJECT:([..].[dbo].[매물아파트매매].[매물아파트매매_PK]) ,
| SEEK :([매물아파트매매.[인터넷매물]=1 AND
| [매물아파트매매.[아파트시세코드]='A0l011350900056' AND
| [매물아파트매매.[평형]=59 AND
| [매물아파트매매.[평형타입]='A' OR
| [매물아파트매매.[인터넷매물]=2 AND
| [매물아파트매매.[아파트시세코드]='A0l011350900056' AND
| [매물아파트매매.[평형]=59 AND
| [매물아파트매매.[평형타입]='A')
2 |--RID Lookup(OBJECT:([SQLPRO].[dbo].[매물아파트매매]),SEEK:([Bmk1000]=[Bmkl000]))
select 고객 ID,상품명, 지역, ...
from 가입상품
where 회사 = :com
and 지 역 like :reg || '%'
and 상품명 like : prod || '%'
where 회사 'AAA' and 지 역 like '%' and 상품명 like 'BBB%'
<SQL1>
select 고객 ID,상품명, 지역, ...
from 가입상품
where 회사 = :com
and 상품명 like : prod || '%'
<SQL2>
select 고객 ID,상품명, 지역, ...
from 가입상품
where 회사 = :com
and 지 역 = :reg
and 상품명 like : prod || '%'
select 고객 ID,상품명, 지역, ...
from 가입상품
where :reg is null
and 회사 = :com
and 상품명 like : prod || '%'
union all
select 고객 ID,상품명, 지역, ...
from 가입상품
where 회사 = :com
and 지 역 = :reg
and 상품명 like : prod || '%'