• 인덱스 관리를 위한 지침
  • 테이블 데이터 삽입(대량) 후 인덱스를 생성
  • 올바른 테이블과 열 인덱스화
  1. 큰 테이블에서 15% 미만의 행을 자주 검색하는 경우 인덱스를 생성
  2. 다중 테이블 조인에 대한 성능을 향상하려면 조인에 사용되는 열을 인덱스화
  3. 작은 테이블은 인덱스가 필요 없음
  • 인덱스화에 적합한 열
  1. 열에서 값이 비교적 고유(유니크)
  2. 넓은 범위의 값(일반 인덱스)
  3. 작은 범위의 값(비트맵 인덱스)
  4. 열에 많은 널값이 있지만 query에서 값을 가진 모든 행을 종종 검색
  • 인덱스화에 적합하지 않은 열
  1. 열에 많은 널이 있고 not null 값에 대해 검색하지 않음
  2. LONG 및 LONG RAW 열은 인덱스화할 수 없음
  3. 가상 열
  • 성능을 위해 인덱스 열의 순서 지정 : create index 문의 열 순서는 query 성능에 영향을 미칠 수 있음, 가장 자주 사용되는 열을 맨 앞에 지정
  • 테이블당 인덱스 수 제한 : 테이블에는 임의 개수의 인덱스가 존재, 인덱스 수가 많을수록 테이블을 수정할 때 발생하는 오버헤드가 커짐, 테이블에서 데이터를 검색하는 속도와 테이블을 갱신하는 속도 사이에 절충점을 찾아야함
  • 각 인덱스에 대한 테이블스페이스 지정 : 테이블과 인덱스에 동일한 테이블스페이스를 사용하면 테이블스페이스 백업과 같은 데이터베이스 유지 관리를 훨씬 더 편리하게 수행할 수 있음
  • 인덱스 생성 병렬화 고려 : create index문에 nologging을 지정하면 인덱스를 만들고 최소 리두 로그 레코드를 생성할 수 있음, 이 인덱스는 아카이브되지 않으므로 인덱스를 생성한 후 백업을 수행
  1. alter index emp_ename_idx coalesce;
  2. alter index emp_ename_idx rebuild; -> 새로 만드는 것, 사용중일경우 불가능 -> online을 붙이면 가능
  3. alter index emp_ename_idx rebuild online nologging;
  • 옵티 마이저 : 조인 연산자
  • DB 구축
  1. 분석 : ERD
  2. 정규화(Normalization) - 1NF, 2NF, 3NF
  3. 설계 : 관계형 데이터베이스 table
  4. 구축
  • from 절에 2개 이상의 테이블을 참조하는 것이 조인
  • 조인 조건을 쓰는 이유는 두 테이블이 조인했을 때, 쓸모없는 데이터를 걸러내기 위함
  • Nested Loop Join

  1. Driving 행 소스가 스캔됨
  2. 반환된 각 행이 Inner 행 소스에서 조회를 구동
  3. 조인 행이 반환
  4. outer의 값과 inner의 값을 비교하며 조인 조건과 일치하는 데이터를 출력하므로 작업이 모두 끝나지 않아도 일부를 먼저 보여줄 수 있음
  5. optimizer_mode를 first_rows_1 모드로 확인하면 좋음
  6. 더 작은 테이블을 outer table로 사용하지만 추가적인 조건이 있는 경우 달라질 수 있음
  7. join 컬럼에 index가 있는 table을 inner table 로 선정
  8. 행을 줄여줄 수 있는 비조인 조건이 있다면 그 테이블을 driving(outer)로 지정
  9. 부분 범위 처리
  10. IRS -> 좁은 범위
  • Nested Loops Join : Prefetching

  1. 데이터 블럭을 불러올 때, 하나씩이 아니라 가까운 곳의 데이터 블럭도 읽어옴
  2. physical read(물리적)의 지연을 줄이기 위해 사용
  3. 사용하다가 효율성이 떨어진다고 판단되면 알아서 중단
  4. 실행계획이 바뀜
  • Nested Loops Join : 11g 구현

  1. NLJ Batching 기법
  2. Nested Loop 위에 Nested Loop가 하나 더 생김
  • Sort Merge Join

  1. 비교적 넓은 범위
  2. sort를 위해 PGA의 workarea 사용
  3. 자동 PGA관리로 workarea의 메모리를 조절하여 사용 가능
  4. 두 테이블을 sort 후에 데이터를 찾기 때문에 결과행이 많더라도 빠르게 원하는 값들만 가져올 수 있음
  5. outer가 상대적으로 덜 중요
  6. 양쪽 모두 sort하는 것이 부담되니 한쪽만 sort하여 다른 한쪽은 index를 사용할 수 있음
  • Hash join

  1. 작은쪽 테이블을 outer로 설정
  2. outer table = hash table -> 해쉬맵을 그리는 테이블
  3. inner table = probe table
  4. 첫 번째 행을 읽어서 hash 함수에 넣으면 hash value가 나옴
  5. hash value를 hash map에 넣음, 다음 행 반복
  6. hash map에는 join된 결과처럼 데이터들이 저장됨
  7. equal join만 가능

'Oracle > SQL Tuning' 카테고리의 다른 글

Partitioned table  (0) 2020.02.04
subquery  (0) 2020.01.31
Optimizer - 2 + 실행 계획 2  (0) 2020.01.21
실행계획 + Optimizer 연산자  (0) 2020.01.20
Resumable + Tuning - 1  (0) 2020.01.17

+ Recent posts