오라클 튜닝 공부 요약

haman92·2021년 10월 11일
0

INDEX RANGE SCAN
INDEX 선두 컬럼이 where절에 필요로 한다.

오라클 힌트 쓰는법
/*+ INDEX_DESC*/

INDEX SKIP SCAN
선행 컬럼 선택도가 높고 후행컬럼 선택도가 낮을때 쓴다.

OLTP NL조인
OLAP HAS 조인 또는 머지 조인

추가해야 될 컬럼이 적다면 covered index도 고려한다.
테이블 access를 없앨 수 있기 때문이다.

인덱스 작성법
create index indexname on table(column1,column2);

인덱스 액세스 -> 인덱스 스캔범위에 맞춰서 인덱스 리프블록까지 접근한다.
인덱스 필터 -> 테이블 액세스를 결정하는 과정
테이블 필터 -> 쿼리 다음 단계로 전달 또는 최종 결과 집합에 포함된다.

BetWeen을 IN List로 전환할 경우는 IN 안의 Distinct Value가 적을 때 전환한다.

선두 칼럼이 Between이어서 나머지 검색조건을 만족하는 데이터들이 서로 멀리 떨어져있을 때 INDEX SKIP SCAN을 사용한다.

가급적 LIKE 보다는 BETWEEN을 사용한다

INDEX 선정 기준
WHERE절에 자주 사용하는 칼럼
= 조건이 선행 칼럼이거나 선두 칼럼에서 많이 걸러지는 칼럼들

INDEX에서의 소트 연산 생략하는 법
=이 아닌 조건절칼럼들은 ORDER BY 칼럼보다 뒤쪽에 두어야 소트연산 생략이 가능하다.

= 연산자 사용한 칼럼설정
ORDER BY 칼럼 추가
= 연산자가 아니면 데이터 분포를 보고 결정

NL조인에서는 OUTER 테이블에서 최대한 필터를 많이 거르게 만든다. 왜냐하면 INNER 테이블은 반복적으로 접근하기 때문에 같은 데이터를 여러번 반복해서 접근하게 되기때문에 OUTER에서 많이 거를수록 INNER 테이블 액세스를 적게 한다.

실행 계획 로우

왼쪽의 5 2780 8은 각실행계획에서의 반환된 row 수인데 이것은 join과정을 수행하는 때에 각각의 반환되는 수이다. 그렇기 때문에 join 테이블 순서를 바꾼다고 하여도 row수에서 좋아질지는 저 실행계획만을 보고서는 알 수 없다.

소량 nl join
대량 hash join
대량이거나 부등호 일때는 merge join

nl조인기준으로 최적화되어도 랜덤액세스가 많이 일어나고 성능적으로 좋지않으면 대량이다.

FILTER는 기본적으로 NL과 처리 루틴이 같다. 각 ROW마다 적용된다고 생각하면 편하다.

필터는 메인쿼리의 한 로우가 서브쿼리의 한 로우와 조인을 성공하는 순간 진행을 멈춘다. 그리고 로우를 처리한다.
필터는 캐싱 기능을 가지고 인풋 아웃풋을 캐싱한다.
필터 서브쿼리는 메인쿼리에 종속되므로 leading(메인쿼리, 서브쿼리) 이렇게 고정된다.

rownum은 쿼리 unnest를 막는다.

unnest push_subq
no_unnest no_push_subq
위의 두개를 같이 쓰지 않도록 조심한다.

no_merge push_predicate

정렬 기준이 조인 키 컬럼이면
소트 머지 조인도 SORT ORDER BY 연산 생략이 가능하다.

INDEX_DESC ( T, T_IDX)
ROWNUM<=1 은 인덱스 구성 변경시 성능이 저하된다. 주의해서 써야된다.

인덱스로 소트 생략 가능시 윈도우 함수는 쓰지않는다(?)

ROWNUM <= N 시
FIRST_ROWS(N)힌트 사용

윈도우 함수는 MAX보다 RANK를 쓸 것

EX)
..
(
SELECT RANK OVER (PARTITION BY 장비번호 ORDER BY 변경순번 ) NO
FROM ..
)
WEHER NO = 1

MERGE 문
MERGE INTO TABLE 1 AS T1 USING TABLE2 AS T2 ON ( T1.ID = T2.ID)
WHEN MATCHED THEN UPDATE SET ..
WHERE ...
WHEN NOT MATCHED THEN INSERT

DIRECT PATH INSERT 사용시 EXCLUSIVE TM LOCK 걸림
EX) INSERT /*+APPEND*/..

병렬 처리 가능하게 하는 파라미터 변경
ALTER SESSION ENABLE PARALLEL DML

TABLE LOCK = TM LOCK

SELECT FROM T FOR UPDATE
락 해제시까지 기다림
SELECT
FROM T FOR UPDATE WAIT 3
3초 기다림
SELECT * FROM T FOR UPDATE NO WAIT
기다리지 않고 작업을 포기한다.

스칼라 서브쿼리는 입력양이 적을 때 주로 쓴다.
(DISTINCT VALUE 또는 입력되는 양)
아니면 조인으로 풀어쓴다. 대신 OUTER JOIN 이여야 정확하게 일치한다.
만약 TOP N SORT 사용시에 바깥에 스칼라 서브쿼리를 쓴다.

스칼라 서브쿼리는 캐싱기능이 있기때문에 입력양이 적을때 주로쓴다.
혹은 사용자 정의함수의 인풋값이 적을때도 캐싱되기때문에
SELECT (SELECT USER_DEFINE(a) FROM DUAL)
이런식으로 쓸 수 있다. 쓰게되면 사용자 정의함수를 매번 실행하려고 컨텍스트 스위칭을 하지 않아도 되기때문에 CPU등 여러가지로 이득이다.

데이터가 많다면 TABLE FULL SCAN을 사용한다.
그러나 이미 인덱스에 모든 조건 포함이라면 IDNEX_FAST_FULL_SCAN을 쓴다.
PARALLEL(T 4) <- 병렬 처리

테이블을 스캔하면서 읽은 레코드중 대부분은 필터링되고 일부만 선택된다면 인덱스를 이용하는게 효과적이다.(선택도가 낮은 경우)

튜닝의 원칙은 디스크 I/O를 줄이는 것이다.

BITMAP INDEX 랜덤액세스를 줄여주지는 않는다. 여러 인덱스를 동시에 사용 가능하고 대용량 데이터 검색 성능 향상에 효과적이다. 인덱스 구성을 바꿔도 테이블 랜덤액세스 횟수는 같다.

OLTP여도 값의 갯수가 적고 분포가 고르지 않다면 바인드 변수를 사용하지 않는다.

DW, OLAP 에서 사용하는 LONG RUNNING 쿼리에는 바인드 변수를 사용하지 않는다.

I/O 튜닝의 핵심원리 두가지
시퀀셜 액세스에 의한 선택비중을 높인다.
랜덤 액세스 비중을 줄인다.

INDEX SKEW 인덱스의 내용물이 치우치는것
INDEX SPARSE 밀도가 떨어지는것

0개의 댓글