잊지 않겠습니다.

'indexing'에 해당되는 글 1건

  1. 2009.06.24 Index 사용시에 주의할 사항

 



6 블록 이상의 테이블에 적용하라.
  오라클 데이터베이스에서 1개의 블록크기는 init<SID>.ora 파일에 정의되어 있는 DB_BLOCK_SIZE 파라메터의 값에 의해 결정됩니다. 만약 이 파라메터의 값이 8K (8192 byte)라면 9152 BYTE (8k X 6 블록) 이상 되는 크기의 테이블일 때 인덱스를 사용하는 것이 좋습니다. 다시 말하면, 테이블의 크기가 작은 경우라면 인덱스를 사용하지 않는 것이 더 효과적인 방법입니다. 

이유는 "PARALLEL OPTION"에서 소개된 것 처럼 전체 테이블 스캔인 경우 빠른 검색을 위해 DB_FILE_MULTIBLOCK_READ_COUNT 파라메터가 제공되고 이 파라메터에 의해 한 번에 읽을 수 있는 데이터 블록의 크기가 결정되기 때문에 테이블의 크기가 작은 경우에는 테이블 전체 스캔이 더 유리할 수 있습니다.

다른 예를 한가지 들어 보겠습니다. 만약, 2페이지 밖에 되지 않는 한 권의 책이 있다고 가정해 보겠습니다. 인덱스라는 타이틀이 설명되어 있는 페이지를 찾으려고 합니다.

첫 번째 방법은 먼저 목차를 검색하여 원하는 페이지를 찾은 다음 해당 페이지로 이동하는 방법입니다. 두 번째 방법은 직접 2 페이지를 검색하여 찾는 방법입니다. 한 권의 책을 테이블이라고 생각해 봅시다. 테이블의 크기가 작은 경우에는 인덱스를 찾고 해당 페이지를 검색하는 것이 직접 페이지를 검색하는 것 보다 빠르지 않을 수도 있습니다. 즉, 테이블의 크기가 6블록 이하(크기가 작음)인 경우에는 테이블 전체스캔이 더 빠를 수 있습니다.

컬럼의 분포도가 10 ~ 15% 이내인 경우
  분포도란 WHERE 조건절을 만족하는 행수가 테이블의 전체 행수에서 차지하는 비율을 의미합니다. 다음 공식을 참조하십시오.

 
  분포도 = ( 조건을 만족하는 행수 / 전체행수 ) X 100
   
  즉, 테이블에 100개의 행이 있고 WHERE 조건절을 만족하는 행수가 10개일 때 분포도는 10%가 됩니다. 인덱스를 통해 데이터를 빠르게 검색하는 메커니즘은 10 ~ 15% 의 분포도가 좋은 컬럼에 보다 빠르게 데이터를 찾아줍니다.

분포가 범위 이내라고 하더라도 절대량이 많은 경우에는 해쉬 클러스트를 검토하라.
  데이터를 검색하는 방법 중에 인덱스를 통한 검색방법으로 좋은 성능이 기대되지 않을 때 사용되는 검색기법이 클러스트를 이용한 방법입니다. 인덱스의 구조적 문제로 인해 더 이상의 성능향상이 기대되지 못한다면 클러스트 기법을 고려해야 합니다.

분포도가 범위이상 이더라도 부분범위의 검색이 가능하다면 인덱스를 사용하라.
  테이블의 데이터 분포를 살펴보면 매우 다양합니다. 컬럼의 값들이 골고루 좋은 분포를 보이는 테이블, 컬럼의 어떤 값은 좋은 분포도를 보이지만 어떤 값은 분포도가 너무 나쁜 경우의 테이블 등 매우 다양합니다. 모든 조건이 좋은 경우에는 별 문제가 없겠지만, 좋은 조건과 나쁜 조건이 같이 저장되어 있는 경우에는 분포도는 나쁘더라도 인덱스를 사용하는 것이 유리합니다. 

이런 경우에는, 분포도가 좋은 컬럼은 인덱스를 통해 검색하게 하고, 분포도가 나쁜 컬럼은 테이블 전체 스캔방법으로 검색하게 하는 실행계획을 결정하면 됩니다.

 
SQL > CREATE INDEX i_big_emp_deptno ON big_emp (deptno)
SQL > SET AUTOTRACE ON
SQL > SELECT empno, ename FROM big_emp
WHERE deptno = 80;    분포도가 좋은 컬럼은 인텍스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > SELECT /*+FULL(big_emp)*/
 

empno, ename

  FROM big_emp
  WHERE deptno = 10;     분포도가 나쁜 컬럼은 전체 인덱스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP'

인덱스 만을 검색할 수 있다면 분포도가 나쁘더라도 인덱스를 생성하라.
  인덱스를 통해 데이터를 검색하는 방법에는 2가지가 있습니다. 첫 번째 방법은 인덱스를 먼저 검색한 후 테이블로부터 조건을 만족하는 행을 검색하는 방법입니다. 다음 예제를 보십시오.

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
Select절에 열거된 컬럼들을 index에 존재하지 않기 때문에 인덱스 검색후 테이블로부터 해당 컬럼을 검색해야 함니다.
 
이번 예제도 인덱스를 통해 검색하는 방법입니다. 하지만 조금전에 실행된 SQL문과 차이점은 개발자가 실행한 SQL문의 SELECT절에 정의된 컬럼이 검색하려는 인덱스에 존재하기 때문에 인덱스만 검색하면 조건을 만족하는 행을 모두 찾게 되는 경우입니다. 
이러한 검색 방법을 빠른 인덱스 스캔(Fast Index Scan) 이라고 합니다. 

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > DROP INDEX i_big_emp_depton;

https://www.dbguide.net/dbqa/oracle_tune/common/detail1-2.html 에서 무단으로 긁어오기..
언제나 느끼는 것이지만.. 아는 것이 없다. 난. -_-
저작자 표시 비영리 변경 금지
신고
Posted by xyzlast Y2K


티스토리 툴바