INSERT시 /*+ APPEND */ 이용 : Data buffer cash를 이용하지 않아 Redu log를 쌓지 않으므로 성능 향상
- insert /*+ APPEND */ into 테이블명 ~~~
- 단점 : Table lock 발생
 
작업용 테이블은 NOLOGGING 으로 변경
- alter table 테이블명 nologging;
 
결합INDEX
- 조건문에 사용된 컬럼이 모두 (=) 조건이라면 순서와 무관(수직적 탐색 하기 때문)
- 조건문에 사용된 컬럼이 결합인덱스 컬럼의 일부일 경우 : (=)조건 컬럼이 앞에 오는것이 유리
- (=) 조건 컬림이 선두에 오지 않는 결합인덱스는 비효율적(INDEX FULL SCAN이나 INDEX SKIP SCAN 발생)

- Index Range Scan, Index Unique Scan 효율적

- Sort 작업이 생략되도록 컬럼 추가 고려
- Only INDEX로 해결할 수 있는 경우 컬럼 추가 고려
 
Index 사용 안되는 경우
- 컬럼 가공(SELECT * FROM EMP WHERE SUBSTR(EMP_NAME,1,1) = '김')
- 부정형 비교( <> 또는 != 사용)
- 묵시적 Data type 변환(CTZ_NO 컬럼이 문자형인 경우 WHERE CTZ_NO = 1234567 와 같이 사용)
- NULL 또는 NOT NULL 비교(WHERE 절에 IS NULL, IS NOT NULL 사용)
- ※ LIKE, BETWEEN 등을 사용하여 위와 같이 사용하지 않도록 주의
 
Table Random Access 최소화
- Table Random Access 최소화를 위해 Index에 Column 추가 고려
- SELECT * FROM EMP WHERE DEPT_NO = '30' AND AGE < 30;
- INDEX에 DEPT_NO만 있는 경우 INDEX RANGE SCAN 하지만 TABLE RANDOM ACCESS 많이 발생
- INDEX에 AGE 추가 할 경우 TABLE RANDOM ACCESS 감소
 
NL(Nested Loop) 조인
- 건수가 적은 쪽을 드라이빙 테이블로
- 먼저 읽은 테이블(드라이빙 테이블)은 Where절에 맞는 인덱스가, 나중에 읽는 테이블은 조인조건에 맞는
   인덱스가 필요(특히 나중에 읽는 테이블을 Full Table Scan 하게 되면 성능 최악)
 
SM(Sort Merge) 조인
- 대량 데이터 조인시 사용
- 양쪽 집합에 인덱스가 없을 경우 NL 조인보다 유리
- '=' 조건이 아니어도 조인 가능
 
Hash 조인
- 작은 집합을 읽으면서 메모리에 Hash Table 생성(Build Input)
- 대량 데이터 집합을 SM 조인 할때 발생하는 정렬 부하를 줄이기 위해 등장
- '=' 조건으로만 조인 가능
- 크기가 작은 집합을 Build Input으로 하는것이 유리(leading, swap_join_inputs 힌트 이용)
 
서브쿼리
- 인라인뷰(Inline view) : From절 Select
- 서브쿼리(Nested Subquery) : Where절 Select
- 스칼라 서브쿼리(Scalar Subquery) : Select절 Select
 
실행계획(Explain plan)
- 실행계획 순서 : Tree 형태에서 자식 노드 먼저
 
힌트(/*+  */)
- leading : 테이블 액세스 순서 제어(/*+ leading(T1 T2) */)
- ordered : from절에 나열된 순서대로 액세스
- swap_join_inputs : hash join시 build input 테이블 지정(/*+ swap_join_inputs(T1) */)
- use_nl : NL 조인으로 수행할 테이블 지정(/*+ use_nl(T1 T2 T3) */) ※ 조인 순서와 무관
- use_hash : HASH조인으로 수행할 테이블 지정(/*+ use_hash(T1 T2 T3) */)
- full : Full Table Scan할 테이블을 지정(/*+ full(T1) */)
- index : 사용할 인덱스 지정(/*+ index(A IDX1) */인덱스명 /*+ index(A (COL1, COL2)) */컬럼명)
- parallel : 병렬 처리(/*+ parallel(T1 2) parallel(T2 2)*/) 테이블, 병렬도
- pq_distribute : 병렬 수행시 row 분배 방식 결정(/*+ pq_distribute(T1 hash hash) */)
- no_merge : 인라인뷰가 merge되지 않도록 강제, 인라인뷰 첫 select문에 기술
- no_unnest : 서브쿼리를 조인으로 풀지 않고 수행하도록 강제, 서브쿼리 첫 select문에 기술
 
윈도우 함수(Window Function)
- rank : 순위 rank() over(order by Col1/partition by Col1 order by Col2 desc) 동일 값은 동일순위
- dens_rank : rank와 유사하나 동일순위 처리 차이(rank는 1,1,3,3,5 라면 dens_rank는 1,1,2,2,3)
- row_number : rank와 달리 동일한 값이라도 고유한 순위 부여
- sum, max, min, avg, count 함수도 사용 가능
- first_value : 파티션별 윈도우에서 가장 먼저 나온 값(min 함수와 유사)
- last_value : 파티션별 윈도우에서 가장 나중에 나온 값(max 함수와 유사)
- lag : 윈도우에서 이전 몇번째 행의 값을 가져올때 사용
          lag(a1, a2, a3) 형태로 a1:컬럼명, a2:몇번째 이전 지정, a3:null인 경우 대체값
- lead : 윈도우에서 이후 몇번째 행의 값을 가져올때 사용 lag와 사용법은 동일

'DBMS > Oracle' 카테고리의 다른 글

오라클 튜닝 팁  (1) 2014.08.14
Posted by DBKIM


티스토리 툴바