트러블슈팅 오라클 퍼포먼스 2판 (2017년)
약한 선택도를 가진 SQL 구문 0 0 20,442

by 구루비스터디 엑세스 최적화 [2023.09.09]


약한 선택도를 가진 SQL 구문

  • 풀테이블스캔 또는 풀 파티션 스캔을 사용한다.


풀 테이블 스캔

  • 풀 테이블스캔 - HWM 아래에 있는 모든 블록을 순차적으로 읽는방법
  • 10.2 버전 : 서버프로세스가 버퍼 캐쉬를 읽어서 처리한다.
  • 11.1 버전 : 읽어야하는 블록의 수 , 대상 테이블의 블록 중 이미 버퍼캐쉬에 존재하는 비율 , 테이블 생성 시 BUFFER_POOL 스토리지 파라미터를 KEEP으로 설정한것에 따라 디스크 I/O 작업이 달라진다.
  • 풀테이블 스캔 = 논리적 읽기 = 블록의 수 != 로우의 건수


HWM 재조정

HWM 재설정을 위해선 Object-reorg 작업 필요


풀 파티션 스캔

  • 파티션은 불필요한 데이터를 사전에 제외하기 위한 기능으로 논리적 읽기횟수를 줄이는 핵심기능이다. (파티션프루닝)
  • 2가지 전제조건
    • 1) 테이블 파티션이 되어 있어야 한다.
    • 2) SQL구문에 조건 또는 조인조건에 파티션키가 존재해야한다.

범위 파티셔닝(range)

Partition Range Single
  • 단 하나의 파티션만 액세스
  • 만약 조건에 바인드변수를 사용할 경우 Pstart , Pstop 값이 KEY로 표시됨
  • 파싱당시에 알수 없어 런타임시 파티션 프루닝이 이루어진다.


Partition Range Iterator
  • 여러개의 파티션을 액세스, 연속된 범위에 대해서만 동작한다.
  • 12.1.0.2 존맵기반의 파티션 프루닝에도 사용된다.


Partition Range Inlist
  • 한개 또는 여러개의 IN조건으로 구성된 경우 발생
  • Pstart , Pstop 은 KEY(I) 표시 , Starts 는 몇개의 파티션을 읽었는지를 의미한다.


Partition Range All
  • 파티션 키에 아무런 제한 조건이 적용되지 않은 경우라면 모든 파티션을 액세스한다.
  • 파티션 키에 대한 부정형 연산이 제한 조건으로 사용될 때 사용된다.


Partition Range Empty
  • 어떠한 파티션에도 처리와 관련된 데이터가 저장되어 있지 않음을 인식했을?


Parition Range OR
  • 파티션키에 대한 분리성 조건 (OR 조건)을 가지는 경우라면


Partition Range Subquery
  • 제한 조건이 조인조건인 경우
  • 조인 조건을 이용한 파티션 프루닝은 항상 합리적인 것은 아니다.
  • 따라서 다음의 3가지 전략을 가지고 접근한다.
    • 1) 파티션 프루닝을 피하는 것이다.
    • 2) NESTED LOOP 조인을 이용해 파티션 프루닝이 발생해야 하는 테이블을 두번? 자식으로 액세스 하는것이다.
    • 3) HASH JOIN 또는 MERGE JOIN을 수행하는것이다.
      • 서브쿼리 프루닝 (첫번째 자식에서 액세스 하는 테이블에 대해서 재귀 쿼리 수행하여 조인 조건에서 사용하는 컬럼을 찾고, 여기서 찾은 컬럼값을 사용하여 두번? 자식의 파티션키를 찾는다.)
      • 파티션 프루닝을 통해 얻을 수 있는 이득보다 재귀 쿼리의 실행으로 인한 오버해드가 적을 경우에만 세번째 기법을 이용한다.


Partition Range Join-filter
  • 11.1부터 조인필터프루닝 , 블룸필터 프루닝을 제공한다.


Partition Range Multi-Column
  • 파티션 키가 여러 컬럼으로 구성된 경우, 제한 조건에 모든 컬럼이 포한되어 있지 않을 ?에도 파티션 프루닝이 가능하다.


Partition Range And
  • 11.2 부터는 옵티마이저가 여러가지 프루닝 기법을 동시에 사용할 수 있다. (AND 프루닝)|


설계 고려사항

  1. 어떤 컬럼에 어떤 빈도로 제한 조건이 적용될것으로 예상하는지
  2. 이들 컬럼에 어떤 종류의 데?가 저장되는지
  3. 어떤 SQL 조건( = , IN , BETWEEN , IS NULL)을 사용할 것인지
  4. 데이터를 정기적으로 압축하거나 삭제할지 , 그리고 어떤 컬럼을 기준으로 처리할지


  • 범위 파티션 : 본질적으로 순차적인 데이터에 적합
  • 리스트 파티션 : 값의 개수가 제한적인 경우에 적합
  • 해시 파티션 ; 값의 개수가 파티션의 개수보다 훨씬 많은 경우에 적합


풀 인덱스 스캔

  • 첫째 , 인덱스가 쿼리에 사용된 모든 컬럼을 포함하는 경우다.
  • 둘째 , 인덱스와 같은 순서로 추출을 해야 한다.
  • 셋째 , count함수와 관련된 경우이다.
"데이터베이스 스터디모임" 에서 2017년에 "전문가를 위한 트러블슈팅 오라클 퍼포먼스(Second Edition) " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4400

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입