2012년 10월 23일 화요일

실행계획 데이터베이스 튜닝 - 실행계획분석 09

힌트로 실행 계획을 제어

문법이 틀려도 힌트가 SQL의 실행에 영향을 미치지는 않는다. 무시된다.

----

힌트 분류

1. 인덱스 엑세스 관련 힌트

2. 테이블 엑세스 관련 힌트

3. 조인 관련 힌트

4. 기타 힌트

5. SQL 변형 제어 관련 힌트

6. REMOTE 실행 계획 관련 힌트

----

인덱스 관련 힌트

INDEX

SQL이 엑세스 할 인덱스를 설정하는 힌트

INDEX(테이블이름, 인덱스이름) 형태로 사용

해당 테이블에 있는 인덱스 중에서 원하는 인덱스를 이용할 수 있게 해준다.

인덱스의 위에서부터 아래로 엑세스를 수행한다는 점에서 INDEX_ASC 힌트와 동일

오라클 10g에서는 INDEX(테이블이름, (컬럼이름, ..., 컬럼이름))으로도 설정 가능하다.

특정 인덱스를 설정하는 것이 아니라 해당 컬럼들로 구성된 인덱스를 유연하게 이용할 수 있게 해준다.

----

INDEX_DESC

인덱스를 구성하는 첫 번째 컬럼에 의해 내림차순으로 데이터가 추출

최근 데이터 순으로 추출하믄 목록 쿼리 또는 최대 값 및 최소 값을 추출하는 SQL에서 사용됨

----

INDEX_FFS

FAST INDEX FULL SCAN

일반 INDEX FULL SCAN과의 차이는 디스크 I/O 단위

INDEX_FFS(테이블이름, 인덱스이름)

NO_INDEX_FFS 사용 가능

----

PARALLEL_INDEX

INDEX_FFS 힌트와 동일, 여러 개의 프로세스로 인덱스 FULL SCAN

PARALLEL_INDEX(테이블이름, 인덱스이름, 프로세스개수)

NOPARALLEL_INDEX 사용 가능

----

INDEX_JOIN

2개 이상의 인덱스를 엑세스하여 테이블에 대한 랜덤 엑세스 없이 원하는 결과 데이터를 추출

하나의 테이블에서 데이터에 엑세스 하는 경우이므로 두 인덱스에 대한 조인 조건이 ROWID만 존재하므로 중첩 루프 조인을 사용한다면 성능이 저하된다. 그래서 오라클에서는 인덱스 조인 시에 해쥐 조인만 제공한다.

INDEX_JOIN(테이블이름, 인덱스이름)

----

INDEX_SS

INDEX_SS(테이블이름, 인덱스이름)

NO_INDEX_SS 사용 가능

INDEX_SS_DESC, INDEX_SS_ASC 사용 가능

인덱스의 철 번째 컬럼이 WHERE 조건 절에 설정되지 않고 첫 번째 컬럼의 분포도가 좋지 않아 몇가지 종류의 데이터만 저장될 경우 성능 향상 가능.

----

테이블 엑세스에 대한 힌트

분포도가 나쁘다는 것은 해당 컬럼에 동일한 값을 갖는 데이터가 많다는 의미다.

분포도가 나쁠 경우 해당 인덱스를 이용하는 순간 처리 범위가 증가하기 때문에 테이블의 많은 부분에 엑세스 해야 한다. 이로인해 증가하는 랜덤 엑세스는 엄청난 성능 저하를 발생한다. 따라서 분포도가 좋지 않은 인덱스를 이용하지 못하게 하고 테이블을 전체 스캔하는 것이 성능적인 면에서 더욱 유리하다.

인덱스를 이용하지 못하게 하는 방법에는 여러가지가 있으며, 그 중 하나가 FULL 힌트

FULL(테이블이름)

----

조인 관련 힌트

USE_NL

중첩 루프 조인을 수행

USE_NL(테이블이름, 테이블이름)

앞에 설정한 테이블에 먼저 엑세스, 뒤에 설정한 테이블은 뒤에 엑세스하여 중첩 루프 조인 수행

----

USE_HASH

해쉬 조인 수행, USE_NL 과 동일

----

USE_MERGE

소트 머지 조인, USE_NL 과 동일

----

NL_SJ - 중첩 루프 조인, 세미 조인

NL_AJ - 중첩 루프 조인, 안티 조인

HASH_SJ - 해쉬 조인, 세미 조인

HASH_AJ - 해쉬 조인, 안티 조인

MERGE_SJ - 소트 머지 조인, 세미 조인

MERGE_AJ - 소트 머지 조인, 안티 조인

----

조인 순서에 대한 힌트

ORDERED

두 개 이상의 테이블을 조인할 경우 어느 테이블이 먼저 엑세스 될지는 여러 개의 우선 순위를 확인하여 결정

모든 우선 순위가 동일하다면 FROM 절의 테이블의 역순

FROM 절에 설정한 순서로 테이블에 엑세스하여 조인하고 싶으면 ORDERED 힌트

매우 강력한 힌트로 옵티마이져는 이 힌트를 거의 무시하지 않는다.

----

LEADING

해당 힌트에 설정하는 테이블 순서에 의해 조인 순서가 결정

ORDERED 힌트와 함께 사용한다면 ORDERED 힌트가 우선시 된다.

/*+ LEADING(B, A) */

....

기타 힌트 생략 ...

댓글 없음:

댓글 쓰기