계획을 집행하다

7645 단어 oracle- 최적화
1. 실행 계획이 무엇인지(explain plan)
실행 계획: ORACLE에서의 실행 과정이나 접근 경로에 대한 조회 문구의 설명입니다.
2. 실행 계획을 어떻게 보는가
1: PL/SQL에서 F5를 눌러 실행 계획을 검토합니다.제3자 도구 toad 등.
많은 사람들이 PL/SQL의 집행 계획은 기수, 최적화기, 소모 등 기본 정보만 볼 수 있다고 생각하는데 사실 이것은 PL/SQL 도구에 설정할 수 있다.많은 기타 정보를 볼 수 있다. 아래와 같다.
2: SQL*PLUS(PL/SQL의 명령 창과 SQL 창 모두 가능)에서 다음 절차를 수행합니다.
 
 SQL>EXPLAIN PLAN FOR
          SELECT * FROM SCOTT.EMP;  --    SQL  
 SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

 
 
3: SQL*PLUS(일부 명령은 PL/SQL에서 유효하지 않음)에서 다음 명령을 실행합니다.
SQL>SET TIMING ON - 실행 시간 통계를 표시하는 컨트롤 데이터 SQL>SET AUTOTRACE ON EXPLAIN - 이렇게 설정하면 실행 계획, 스크립트 데이터 출력을 포함하고 통계 정보가 없습니다. SQL>실행 계획을 볼 수 있는 SQL 문구 SQL>SET AUTOTRACE OFF - AUTOTRACE 보고서를 생성하지 않습니다.기본 모드인 SQL > SET AUTOTRACE ON - 이렇게 설정하면 실행 계획, 통계 정보, 스크립트 데이터 출력 SQL > 실행 계획을 보기 위한 SQL 문구 SQL > SET AUTOTRACE OFF SQL > SET AUTOTRACE TRACEONLY가 포함됩니다. 이렇게 설정하면 실행 계획, 통계 정보가 있습니다.스크립트 데이터 출력 SQL>실행 계획을 보려는 SQL 문구 SQL>SET AUTOTRACE TRACEONLY STAT 없음 - 이렇게 설정하면 통계 정보만 포함됩니다. SQL>실행 계획을 보려는 SQL 문구만 포함됩니다.
3. 실행 계획 이해
1. 실행 순서
집행 순서의 원칙은 위에서 아래로, 오른쪽에서 왼쪽으로
위에서 아래로: 집행 계획에 일반적으로 여러 개의 노드, 같은 등급(또는 병렬)의 노드, 위에서 위로 우선 집행, 아래에서 뒤로 집행이 포함되어 있다.
오른쪽에서 왼쪽으로: 어떤 노드 아래에 여러 개의 하위 노드가 존재하는데 먼저 가장 오른쪽에 있는 하위 노드부터 실행한다.
물론 PL/SQL 도구에서도 실행 순서를 볼 수 있습니다.다음 그림은 다음과 같습니다.
2. 실행 계획의 필드 설명
SQL>
명사 해석:
recursive calls 재호출
db block gets buffer cache에서 읽은 Block의 수량 현재 요청한 블록의 수량입니다. 현재 모델 블록은 작업 중 추출된 블록의 수량을 뜻합니다. 일치성 읽기에서 발생하는 정상적인 상황이 아니라 검색 추출된 블록은 검색 검색이 시작된 시점에 존재하는 데이터베이스입니다.현재 블록은 이 시간 전이나 이후의 블록 수가 아니라 이럴 때 블록이 존재합니다.
buffer cache에서 읽은 undo 데이터의 Block 수량 데이터 요청 총수는 스크롤 단계의 Buffer에서 데이터 일치성 읽기에 필요한 데이터 블록입니다. 이 개념은 이 동작을 처리할 때 일치성 읽기 상태에서 여러 블록을 처리해야 한다는 것입니다. 이 블록이 발생하는 주요 원인은 조회 과정에서다른 세션에서 데이터 블록을 조작하기 때문에 조회할 블록에 수정이 생겼습니다. 그러나 우리의 조회는 이러한 수정을 하기 전에 호출된 것이기 때문에 스크롤 단계의 데이터 블록의 앞 이미지를 조회하여 데이터의 일치성을 확보해야 합니다.이렇게 하면 일치성 읽기가 생겼다.
 
physical reads 물리적 읽기는 디스크에서 블록을 읽는 수량입니다.그 발생의 주요 원인은 다음과 같다.
1: 이러한 블록은 데이터베이스 캐시에 없습니다.
2: 전체 테이블 스캔
3: 디스크 정렬
redo size DML에서 생성된 redo 크기
sorts 메모리에서 실행되는 정렬량
sorts (disk) 디스크에서 실행되는 정렬량
2091 bytes sent via SQL*Net to client가 SQL*Net에서 클라이언트에게 2091 바이트의 데이터를 보냈습니다.
416 bytes received via SQL*Net from client 클라이언트가 SQL*Net에 416 바이트의 데이터를 보냈습니다.
참조 문서: SQLPlus User's Guide and Reference Release 11.1
db block gets,consistent gets,physical reads 이 세 가지의 관계는 다음과 같이 요약할 수 있다. 논리적 읽기는 ORACLE이 메모리에서 읽은 데이터 블록의 수량을 가리키는데 일반적으로 다음과 같다.
consistent gets + db block gets. 메모리에서 필요한 데이터 블록을 찾지 못하면 디스크에서 가져와야 하기 때문에 물리적 읽기가 발생한다.
3. 구체적인 내용 보기
1> Plan hash Value
이 줄은 이 문장의hash값입니다. 우리는ORACLE이 모든ORACLE 문장에 대한 실행 계획을 SHARE POOL에 놓고 처음으로 하드 해석을 거쳐hash값을 생성하는 것을 알고 있습니다.다음에 다시 실행할 때hash값을 비교합니다. 같으면 하드 해석을 실행하지 않습니다.
2> COST
 
COST는 단위가 없고 상대값이다. SQL이 CBO 방식으로 집행계획을 분석할 때 ORACLE에서 CBO 원가를 평가하고 집행계획을 선택할 수 있도록 제공한다.명확한 의미는 없지만 대비하면 매우 유용하다.
공식: COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/Sreadtim
 
3> 위의 실행 계획 열 필드에 대한 설명:
Id: 실행 순서지만 실행의 선후 순서가 아닙니다.수행의 선후는 Operation 들여쓰기에 따라 판단됩니다(맨 오른쪽 맨 위에서 가장 먼저 실행하는 원칙으로 차원 관계를 보면 같은 레벨에서 어떤 동작이 하위 ID가 없으면 가장 먼저 실행됩니다. 일반적으로 들여쓰기 길이에 따라 판단하는데 가장 큰 들여쓰기가 가장 먼저 실행되고 두 줄의 들여쓰기가 같으면 위의 것을 먼저 실행합니다.)
Operation: 현재 작업의 내용입니다.
Name: 작업 객체
Rows: 즉 10g 버전 이전의 Cardinality (기수) 입니다. Oracle은 현재 작업의 반환 결과 집합 줄을 추정합니다.
Bytes: 단계를 수행한 후 반환되는 바이트 수를 나타냅니다.
Cost(CPU): SQL 실행의 대가를 설명하는 데 사용되는 이 단계까지의 실행 비용을 나타냅니다.
Time: Oracle은 현재 작업의 시간을 추정합니다.
4. 술어 설명:
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("B"."MGR"IS NOT NULL)
4 - access("A"."EMPNO"= "B"."MGR")
Access: 이 술어 조건의 값이 데이터의 접근 루트에 영향을 미칠 수 있음을 표시합니다. (전체 테이블 스캔 또는 인덱스)
Filter: 술어 조건의 값은 데이터의 접근 경로에 영향을 주지 않고 필터만 합니다.
술어에서access를 주로 주의하고 술어의 조건을 고려하여 사용하는 접근 경로가 정확한지 확인해야 한다.
5. 동태 분석
실행 계획에 다음과 같은 프롬프트가 있는 경우
Note
------------
-dynamic sampling used for the statement
이것은 사용자 CBO가 현재 사용하고 있는 기술을 제시하는데 사용자가 계획을 분석할 때 이러한 요소를 고려해야 한다.이 알림이 나타나면 현재 테이블에서 동적 샘플링을 사용했음을 설명합니다.우리는 이 표가 분석을 하지 않았을 수도 있다고 추정했다.
여기에는 두 가지 상황이 나타날 것이다.
(1) 만약에 표를 분석한 적이 없다면 CBO는 동적 샘플링을 통해 분석 데이터를 얻거나 계획을 정확하게 집행할 수 있다.
(2) 만약에 표를 분석했지만 분석 정보가 너무 낡으면 CBO는 동적 샘플링을 사용하지 않고 이런 낡은 분석 데이터를 사용해서 잘못된 실행 계획을 초래할 수 있다.
4. 테이블 접근 방식
1. FTS(Full Table Scan) 전체 테이블 스캔
 
2. Index Lookup 인덱스 검색
There are 5 methods of index lookup:
index unique scan - 인덱스 고유 검색
유일한 인덱스로 한 개의 ROWID를 찾으면 UNIQUE나 PRIMARY KEY 제약이 존재하면 ORACLE
고유성 검사 자주 수행
Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index.
index range scan - 색인 부분 검색
Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. > <<>>= <= between) .
하나의 인덱스로 여러 줄 데이터를 액세스하고 유일한 인덱스에서 인덱스 범위 검색을 사용하는 일반적인 경우는 술어(WHERE 제한 조건)에서 범위 조작 기호(예를 들어 >, <<>, >=, <=, BWTEEN)를 사용하는 것이다.
인덱스 전역 검색
Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order.
index fast full scan - 인덱스 빠른 전역 검색, order by 없이 자주 발생
Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index.
index skip scan - 인덱스 점프 스캔, where 조건열이 비인덱스인 전제 상황에서 자주 발생
Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search.
3. Rowid 물리적 ID 검색
This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid 스캐닝은 가장 빠른 데이터 접근 방식이다
저자: 소상은자
출처:http://www.cnblogs.com/kerrycode/
본고의 판권은 작가가 소유하고 전재를 환영하지만 작가의 동의 없이 이 단락의 성명을 보존해야 하며 문장 페이지의 뚜렷한 위치에서 원문의 연결을 제공해야 한다.

좋은 웹페이지 즐겨찾기