본문 바로가기

Oracle/Tuning

테이블 설계시 주의사항

테이블 설계시 주의사항

1. 테이블 생성 전에 정규화 및 컬럼의 데이터 유형을 계획하라
2. 블록 영역을 위해 Initial, Next, Extents, PCTFREE, PCTUSED를 충분히 고려하라
   - 단편화(구멍) / 행 이주(블럭이 모자라서 통채로 옮김) / 행 연결(여러개 블럭에) 현상 방지
3. 저장될 테이블스페이스를 반드시 지정하라 (사용자 데이타, 롤백 데이타, 분류 데이타)
   - 기본 tablaspace에 넣지마라
   - tablesapce를 명시 안하면 사용자의 default tablespace에 생성됨
   - dba_segments 테이블에서 생성된 table의 tablespace 확인 가능
   - tablespace 변경 : alter table big_emp move tablespace test
4. 필요한 경우 NoLogging 키워드를 사용하라
   - 데이터 유실시 다시 복구할 수 있는 테이블은 백업 저장안해도 된다.
   - create table ~~~ NOLOGGING;  (기본값은 LOGGING)
   - alter table test1 LOGGING;
5. 필요한 경우 CACHE 키워드를 사용하라
   - 자주 사용하는 테이블은 데이터 버퍼 캐시에서 지워지지 않도록 설정
   - create table ~~~ CACHE;  (기본값은 NOCACHE)
6. 테이블의 파티션 여부를 결정하라
   - 파티셔닝 테이블 : 하나의 테이블이 여러개의 테이블스페이스에 저장될 수도 있다.
   - 오라클 8부터 추가된 기능

인덱스 선정

액세스 유형의 조사 (설계단계)
- 반복 수행되는 액세스 형태를 찾는다.
- 분포도가 아주 양호한 컬럼을 찾아 액세스 유형을 찾는다.
- 자주 넓은 범위의 조건이 부여되는 경우를 찾는다.
- 자주 조건절에 사용되는 컬럼들의 액세스 유형을 찾는다.
- 자주 결합되어 사용되는 경우를 찾는다.
- SORT 의 유형을 조사한다.
- 일련번호를 부여하는 경우를 찾는다.
- 통계자료 추출을 위한 액세스 유형을 조사한다.

INDEX의 활용 (선정기준)
- 분포도가 좋은 컬럼은 단독적으로 생성하여 활용도 향상
- 자주 조합되어 사용되는 경우는 결합인덱스 생성
- 각종 엑세스 경우의 수를 만족할 수 있도록 인덱스간의 역할 분담
- 가능한 수정이 빈번하지 않는 컬럼
- 기본키 및 외부키 (조인의 연결고리가 되는 컬럼)
- 결합 인덱스의 컬럼순서 선정에 주의
- 반복수행(loop 내) 되는 조건은 가장 빠른 수행속도를 내게 할 것
- 실제 조사된 액세스 종류를 토대로 선정 및 검증

INDEX의 활용 (고려사항)
- 새로 추가된 인덱스는 기존 엑세스 경로에 영향을 미칠 수 있음
- 지나치게 많은 인덱스는 오버헤드를 발생
- 넓은 범위를 인덱스로 처리시 많은 오버헤드 발생
- 옵티마이져를 위한 통계데이타를 주기적으로 갱신
- 인덱스의 개수는 테이블의 사용형태에 따라 적절히 생성
- 분포도가 양호한 컬럼도 처리범위에 따라 분포도가 나빠질 수 있음
- 인덱스 사용원칙을 준수해야 인덱스가 사용되어짐
- 조인(join)시에 인덱스가 사용여부에 주의

FULL TABLE SCAN 을 빠르게 하는 방법
- PARARELL QUERY 사용
- DB_FILE_MULTIBLOCK_READ_COUNT 파라메터를 크게 설정 (16 정도 잡으면 시스템에 따라 8~10 정도 읽음..)

인덱스 설계시 주의사항
1. 6블럭 이상의 테이블에 적용 (DB_BLOCK_SIZE)
2. 컬럼의 분포도가 10~15% 이내일때 적용
   : 분포도 = (1/컬럼값의 종류)*100 = (컬럼값의 평균 로우수 / 테이블의 총 로우수) * 100
3. 분포도가 범위 이상이라도, 부분 범위 처리를 목적으로 하는 경우
4. 인덱스만을 사용하여 요구를 해결하고자 하는 경우 (손익 분기점)