본문 바로가기
데이터베이스

데이터베이스 힌트(Hint) - 2

by 다시쓰는 2023. 11. 28.
반응형

 

병렬처리 관련 힌트

 

 병렬처리에 관련된 힌트들은 시스템 자원을 많이 사용하게 되므로 사용자의 요구에 따라 결정되어야 한다. 이런 유형의 힌트는 처리방법을 개선하여 일의 양을 줄이는 것이 아니라 시스템 자원을 최대한 사용하더라도 결과를 얻는 절대 시간을 줄이겠다는 것이 목적이다. 옵티마이져 입장에서는 가능한 모든 수단을 총동원해서라도 단위 SQL의 최적화를 하고 싶겠지만 현실 상황에 따라 판단이 달라져야 하므로 사용자의 의지에 의해서 결정되어야 한다.

 신제품 경쟁이 치열한 업종에서는 수많은 사람들을 동원하여 철야작업을 하더라도 공사기간을 줄이는 것이 최고의 목표겠지만, 그렇지 않은 경우에는 경비를 절약하는 것이 더 중요할 수도 있다.

 병렬처리는 시스템에 부하를 주더라도 수행시간을 당기는 것이 더 필요할 때 적용하는 처리방법이다.

 가능하다면 기본 값(Default value)을 사용하지 말고, SQL단위에서 힌트를 사용하여 적용하는 것이 바람직하다.

 병렬처리 힌트는 병렬처리에서 나타나는 병렬 프로세서들의 개수를 지정하거나 내부 처리 방법에 대한 우리의 요구를 전달하기 위해 사용한다. 특히 병렬 프로세스의 개수는 수행시간 및 시스템의 부하에 직접적인 영향을 미치므로 매우 중요하다.

 

 - PARALLEL : 대량의 데이터에 대한 테이블을 액세스 할 때와 DML을 처리할 때 SQL의 병렬처리를 지시하는 힌트이다. 일발적으로 병렬 스레드(Parallel threads)를 나타내는 숫자와 함께 사용하고 있다. 만약 힌트에 병렬도(Parallel Degree)를 나타내는 숫자를 정의하지 않으면 옵티마이져는 PARALLEL_THREADS_PER_CPU 파라메터에 정의된 값을 이용하여 자동으로 계산해서 적용한다.

 만약 테이블을 정의할 때 'PARALLEL'을 지정하였다면, 힌트를 사용하지 않아도 병렬처리가 가능한 경우에는 이 병렬도를 적용한다. 그러나 DELETE, INSERT, UPDATE, MERGE등의 DML문장을 병렬로 수행하기 위해서는 반드시 해당 세션을 ALTER SESSION ENABLE PARALLEL DML로 지정해야만 병렬처리가 가능하다. 한 번 지정한 병렬도는 내부적으로 GROUP BY나 정렬처리 등의 단위 작업에도 재차 적용될 수 있다. 만약 병렬처리에 어떤 제한요소가 발생하게 되면 이 힌트는 무시된다.

 

 - NOPARALLEL : 테이블의 정의 시에 PARALLEL 옵션을 부여하면 쿼리에 직접 힌트를 주지 않아도 옵티마이져는 병렬처리가 가능하다고 판단되면 병렬처리 실행계획을 수립한다. 이때 SQL에 이 힌트를 적용하면 옵티마이져는 해당 테이블의 PARALLEL 파라메터를 무시하고 병렬처리를 하지 않는 실행계획을 수립하게 된다.

 

 - PQ_DISTRIBUTE : 병렬 조인의 속도를 향상시키기 위해 슬레이브 프로세스 - 생산사와 소비자 프로세스 - 사이에서 조인할 테이블의 로우를 서로 주고 받는 할당 작업(Distribution)을 하는 방법을 정의하는 힌트이다.

 

 - PARALLEL_INDEX : 파티션 인덱스(Patitioned Index)에 대한 인덱스 범위 스캔을 병렬로 수행하기 위한 병렬도를 지정하는 힌트이다.

 

 - NOPARALLEL_INDEX : 인덱스 생성(CREATE)이나 변경(ALTER)에 의해  PARALLEL 파라메터가 적용되어 있는 경우, SQL에서 이 힌트를 적용하면 옵티마이져는 해당 인덱스에 대한 PARALLEL파라메터를 무시하여 병렬 인덱스 범위 스캔을 하지 않게 된다.

 

액세스 수단 선택을 위한 힌트

 

 - FULL : 힌트 내에 정의된 테이블을 전체 테이블 스캔 방식으로 유도하는 힌트이다.

 

 - HASH : 해쉬 클러스터 테이블을 액세스할 때 해쉬 스캔 방식으로 액세스하도록 유도하는 힌트이다.

 

 - CLUSTER : 클러스터링 테이블을 액세스할 때 클러스터 인덱스를 통해 스캔하도록 유도하는 힌트이다.

 

 - INDEX : 인덱스 범위 스캔에 의한 테이블 액세스를 유도하는 힌트이다. 뷰를 액세스하는 쿼리의 경우 뷰 쿼리 내에서 있는 테이블에 대한 인덱스 스캔을 지정할 수도 있다.

 

 - NO_INDEX : 옵티마이져가 실행계획을 수립할 때 지정한 인덱스는 제외하고, 다른 액세스 방법을 고려하도록 유도하는 힌트이다.

 여기에 지정된 인덱스를 제외한 나머지 인덱스들을 액세스 수단으로 고려한다. 그러나 만약 인덱스들을 지정하지 않고 테이블만 정의하면 해당 테이블의 모든 인덱스들을 힌트 내에 정의한 것으로 인정하여 모든 인덱스를 고려 대상에서 제외한다. 동일한 인덱스를 NO_INDEX 힌트와 함께 INDEX, INDEX_ASC, INDEX_DESC, INDEX_COMBINE, INDEX_FFS등에 사용하면 옵티마이져는 두 힌트 모두를 무시한다. 이런 특성을 이용해 튜닝을 위한 테스트를 할 때 기존에 부여했던 힌트를 지우지 않고 잠시 무시하도록 하기 위해 사용할 수 있다. 또한 뷰쿼리에 삽입한 힌트를 무시할 때도 적용할 수 있다.

 

 - INDEX_ASC : 인덱스를 경유하여 테이블을 액세스할 때 힌트에 지정한 인덱스를 인덱스 컬럼 값의 오름차순(정순)으로 범위 스캔하도록 유도하는 힌트이다.

 

 - INDEX_DESC : 인덱스를 경유하여 테이블을 액세스할 때 힌트에 지정한 인덱스를 인덱스 컬럼 값의 내림차순(역순)으로 범위 스캔하도록 유도하는 힌트이다.

 

 - INDEX_COMBINE : 2개 이상의 인덱스를 비트맵 인덱스로 변경/결합하여 테이블을 액세스하는 방식으로 유도하느 힌트이다. 해당 인덱스는 일반 인덱스, 비트맵 인덱스 모두 가능하며, 서로 다른 타입의 인덱스에서도 변경/결합이 가능하다.

 INDEX_COMBINE 힌트에서 테이블 이름만 부여하고 인덱스 이름을 명시하지 않으면 옵티마이져가 해당 테이블에서 가장 적합한 인덱스를 선택하여 처리한다.

 

 - INDEX_FFS : 전체 테이블을 스캔하는 것과 유사한 방법으로 인덱스 전체범위를 스캔하는 방식으로 유도하는 힌트이다. 비록 인덱스를 스캔하지만 다중블록을 스캔한다.

 이와 반대로 NO_INDEX_FFS 힌트는 힌트에서 지정한 테이블의 인덱스에 대해 ' 고속 전체 인덱스 스캔' 방식을 제외한 다른 엑세스 방법을 사용하도록 유도한다.

 

 - INDEX_JOIN : 2개 이상의 인덱스들만으로 조인을 수행하도록 유도하는 힌트이다. 이 때 인덱스를 구성하는 컬럼이 해당 질의에서 필요로 하는 모든 컬럼을 포함하고 있어야 한다. 즉, 테이블을 전혀 엑세스하지 않고 인덱스들만 쿼리를 처리할 수 있어야 한ㄷ. 인덱스 조인은 2개 이상의 인덱스를 스캔한 결과를 ROWID로 해쉬 조인을 수행하여 결과를 얻는다.

 

 - INDEX_SS : 인덱스 스킵 스캔 방식으로 인덱스를 액세스하도록 유도하는 힌트이다. 이와 반대로 NO_INDEX_SS 힌트는 힌트에서 지정한 테이블의 인덱스에 대해 스킵 스캔을 제외한 다른 액세스 방법을 사용하도록 유도한다.

 

 - INDEX_SS_ASC : 인덱스 스킵 스캔 방식으로 범위 스캔하는 경우 오름차순으로 인덱스를 읽도록 하는 힌트이다.

 

 - INDEX_SS_DESC : 인덱스 스킵 스캔 방식으로 범위 스캔하는 경우 내림차순으로 인덱스를 읽도록 하는 힌트이다.

반응형