2017년 3월 10일 금요일

ORACLE 튜닝


- 처음 컬럼이 where 조건절에 존재하지 않으면 index를 Access할 수 없다.
- Unique index는 Unique Scan 과 Range Scan 모두 가능하다. Unique Scan은 Unique Index의 구성 칼럼 모두에 대해 where 조건 절에서 EQUAL(=) 상수 받을 때의 Access.
- Unique 인덱스의 구성 칼럼 모두와 EQUAL(=) 상수 모두를 만족 시키지 못하면 Range Scan을 한다. Range Scan의 경우 적어도 하나의 컬럼에 대하여 where 조건절에서 EQUAL(=) 상수 를 받을 때의 Access 행위를 말하고 모든 Index의 where조건절에 없을 경우도 해당이 된다.
- Non Unique 인덱스는 Range Scan하고 비교연산자 상수를 받을때 Accesss이다.

- 실행계획보기
1. explain plan for SQL문
2. select * from table(dbms_xplan.display);

- 결한인덱스 변경시 기존 SQL문에도 영향이 있고 순서가 중요하다.
- 결한 인덱스 첫번째 컬럼 연산자가  EQUAL(=) 이여야 한다.
- 옵티마이저는 컬럼의 매칭율이 높은것중 최근에 생성된 Index를 ACCESS 한다.
- index Suppressing
: CHAR나 VACRH의 DATE TYPE과 DATE를 비교할 경우 DATE DATA TYPE 기준으로 비교되는것에 함수에 적용된다.
ex)  컬럼 TD_DATE 가 DATE TYPE일 경우
WHERE TD_DATE = '20170311' 일 경우  WHERE TD_DATE = TO_dATE( '20170311' , 'YYYYMMDD') 로 사용.
:  CHAR나 VACRH의 DATE TYPE과 NUMBER를 비교할 경우 NUMBER DATATYPE 기준으로 비교되는것에 함수에 적용된다.
EX) WHERE CODE = 0544 는 내부적으로 WHERE TO_NUMBER(CODE) = 0544 로 사용.

- EXISTS는 주어진 조건을 만족하는 첫번쨰 레코드를 만나면 트랜잭션을 멈춘다.
- JOIN은 순서에따라 영향을 받는다. ( 처리가 좁은 테이블부터 시작하게 한다.)

- Driving Table이란 가정 먼저 Access하는 Table이다.
-Cost Base Optimizer : 통계쩡보가 먼저 우선하며 동일조건일 경우 from절의 앞 테이블이 Driving Table됨.
- Rule Base Optimizer : 동일조건일 경우 from 절의 뒤 Table이 Driving Table이 됨.

-일반적으로 동일 조건일경우 From절의 뒤부터 먼저 ACCESS된다. (Optimizer MOME가 RULE이거나 CHOOSE인 경우 )

- Nested Loop Join
: 부분범위처리를 하는경우
: 순차적으로 처리
: Driving table의 인덱스 액세스는 첫번쨰 로우만 Random Access이고 나머지는 Scan
연결작업은 Random Access 이다.

- Sort Merge Join
: 전체범위를 처리하는경우
: Euqi-Join에 대해서만 가능
: HINT USER_MERGE을 사용해 일반적으로 구현
: 자신의 인덱스를 사용하는 경우만 Random Access이고 Merge작업은 Scan방식
: 상수값을 받아 줄여진 범위가 30%이상이면 Sort/Merge Join이 유리함.
: 처리량이 많은경우 ( Random Access를 하지 않으므로 )
: 자신의 처리범위를 줄이는게 관건.

-Hash Join
: 전체범위를 처리하는 경우 유리.
: HINT USER_HASH를 사용해 일반적으로 구현
: Oracle8 Server는 Cost-Based 옵티마이저를 사용할 경우만 Hash Join을 고려.
: Hash Join/Merge Join의 사용 여부는 옵티마이저가 결정하며, 조인 칼럼들에 unique 해쉬 값을 생성하는데 유리한 테이블을 지정함.
: Equi-Join에 대해서만 가능
: Hash Function을 이용해 메모리와 CPU를 많이 사용해 대용량 데이터 처리할경우 사용.
: 양쪽 테이블의 scan이 동시에 이루어지므로 Parallel Query Option사용하면 효과적.
: 자신의 처리범위를 줄이는게 관건.
: 처리량이 많은경우 ( Random Access를 하지 않으므로 )

- Outer Join
: IN, OR 비교 연산자는 사용할수 없으므로 IN LINE VIEW 이용한다.
: 모든 컬럼에 반드시 (+)를 사용해야 한다.
: 기준이 되는 테이블이 반드시 DRIVING TABLE이 된다.

- MAX 함수
: HINT INDEX_DESC 를 이용해서 Access를 줄인다.

- UNION
: 중복되는 사항이 없는경우 SORT 하지 않는 UNION ALL을 사용한다.

- Exists
: 주오진 조건을 만족하는 첫 번째 레코드를 만나면 트랜잭션을 멈춘다.



- 통계정보 관련 명령어

--관리자로 로그인
sqlplus
sys

-- 파일실행 ( 해당 경로로 가서 sqlplus 실행 )
@파일이름.sql

-- 옵티마이저 정보 보기
SHOW PARAMETER OPTIMIZER

--권한 변경
ALTER SYSTEM SET OPTIMIZER_MODE=RULE SCOPE=SPFILE;
ALTER SYSTEM SET OPTIMIZER_MODE=ALL_ROWS SCOPE=SPFILE;

-- 재시작
STARTUP FORCE

-- 통계만들기
ALTER SESSION SET SQL_TRACE=TRUE;

sql문

ALTER SESSION SET SQL_TRACE=FALSE;

-- SQL_TRACE 여부
SHOW PARAMETER TIMED_STATISTICS

--TRC 파일 위치
SHOW PARAMETER USER_DUMP_DEST

-- 통계정보 새로 생성
ANALYZE TABLE TAB35 COMPUTE STATISTICS;

-- 테이블의 기존 통계정보를 이용하여 생성
ANALYZE TABLE TAB35 ESTIMATE STATISTICS;

-- tkf 생성
tkprof 기존파일명.trc 만들파일명.TKF SYS=NO EXPLAIN=로그인ID/PW

Share:

0 개의 댓글:

댓글 쓰기