계획을 실행하는 단계
실행 계획의 각 단계는 다음 단계에서 사용되거나 마지막 단계에서 SQL 문을 실행한 사용자나 애플리케이션에 반환되는 행 집합을 반환합니다. 각 단계에서 반환된 행 집합을 행 원본이라고 합니다. 그림 5-1 수형도는 한 걷기에서 다른 걷기로의 데이터 흐름을 보여줍니다. 각 단계의 번호는 실행 계획을 볼 때 단계가 표시되는 순서를 반영합니다. (실행 계획을 보는 방법은 간략하게 설명되어 있습니다.) 일반적으로 이는 각 단계가 수행되는 순서가 아닙니다. 실행 계획의 각 단계는 데이터베이스에서 행을 검색하거나 하나 이상의 행 소스에서 입력으로 행 데이터를 받습니다.
빨간색 상자로 표시된 단계는 데이터베이스의 데이터 파일에서 데이터를 물리적으로 검색합니다. 이 단계를 액세스 경로라고 합니다. Oracle에서 사용할 수 있는 액세스 경로에 대해서는 나중에 자세히 소개합니다.
3단계와 6단계에서는 각각 EMP 테이블과 SALGRADE 테이블의 모든 행을 읽습니다.
5단계에서는 PK_DEPTNO 인덱스에서 3단계에서 반환된 각 DEPTNO 값을 찾습니다. DEPT 테이블과 연관된 행의 ROWID를 찾습니다.
4단계에서는 5단계에서 ROWID가 반환된 행을 DEPT 테이블에서 검색합니다.
검은색 텍스트 상자로 표시된 단계는 두 테이블 간의 연결, 정렬 또는 필터링과 같이 행 소스에서 작동합니다. 자세한 내용은 나중에 설명합니다.
2단계에서는 중첩 루프 작업(C 문의 중첩 루프와 동일)을 구현하고, 3단계와 4단계에서 행 소스를 수신하고, 3단계 소스의 각 행을 4단계의 행 소스와 비교합니다. 결과 행은 1단계로 반환됩니다.
1단계에서는 필터 작업이 완료됩니다. 2단계와 6단계에서 행 소스를 수신하고, 6단계의 해당 행이 있는 2단계의 행을 제거하고, 2단계의 나머지 행을 발급자 또는 애플리케이션에 반환합니다.
일련의 실행 계획 단계 구현
실행 계획의 단계는 번호가 매겨진 순서대로 구현되지 않습니다. Oracle은 먼저 그림 5-1의 트리 구조 그래프에서 잎으로 나타나는 단계(예: 3, 5, 6단계)를 구현합니다. 각 단계에서 반환된 행을 다음 단계의 행 소스라고 합니다. 그런 다음 Oracle은 상위 단계를 구현합니다.
예를 들어, 그림 5-1의 명령문을 실행하기 위해 Oracle은 다음 단계를 다음 순서로 구현합니다.
먼저 Oracle은 3단계를 구현하고 결과 행을 행별로 2단계로 반환합니다.
3단계에서 반환된 각 행에 대해 Oracle은 다음 단계를 구현합니다.
-- Oracle은 5단계를 구현하고 결과 ROWID를 4단계로 반환합니다.
-- Oracle은 4단계를 구현하고 결과 행을 2단계로 반환합니다.
-- Oracle은 2단계를 구현하고 3단계의 행과 4단계의 행을 수락하고 반환합니다.
1단계에 한 줄을 입력하세요.
-- Oracle은 6단계를 구현합니다. 결과 행이 있으면 1단계로 반환합니다.
-- Oracle은 1단계를 구현합니다. 6단계에서 행이 반환되면 Oracle은 2단계의 행을 다음 단계로 반환합니다.
SQL문을 발행한 사용자입니다.
Oracle은 3단계에서 반환된 각 행에 대해 5, 4, 2, 6단계를 한 번씩 수행합니다. 많은 상위 단계를 실행하려면 하위 단계에서 단일 행만 필요합니다. 이러한 상위 단계의 경우 하위 단계에서 단일 행이 반환되는 즉시 상위 단계(및 실행 계획의 나머지 부분)가 구현됩니다. 상위 단계의 상위 단계가 단일 행 반환을 통해 활성화될 수도 있는 경우 해당 상위 단계도 실행됩니다. 따라서 실행 계획의 나머지 부분을 포함하여 실행이 트리에 연결될 수 있습니다. 이러한 작업의 경우 first_rows를 최적화 대상으로 사용하여 사용자 요청에 빠르게 응답할 수 있습니다.
하위 단계에서 차례로 검색된 각 행에 대해 Oracle은 상위 단계와 연결된 모든 단계를 한 번 구현합니다. 하위 단계에서 반환된 각 행에 대해 트리거되는 상위 단계에는 테이블 액세스, 인덱스 액세스, 중첩 루프 조인 및 필터가 포함됩니다.
일부 상위 단계를 구현하려면 하위 단계의 모든 행이 필요합니다. 이러한 상위 단계의 경우 Oracle은 하위 단계에서 모든 행이 반환될 때까지 상위 단계를 구현할 수 없습니다. 이러한 상위 단계에는 정렬, 정렬-병합 조인, 그룹 기능 및 합계가 포함됩니다. 이러한 작업의 경우 first_rows를 최적화 대상으로 사용할 수 없지만 all_rows를 최적화 대상으로 사용하면 이러한 작업이 최소한의 리소스를 소비하도록 할 수 있습니다.
때로는 명령문이 실행될 때 위에서 설명한 것처럼 단계별로 진행되지 않고 병렬로 실행될 수 있습니다. 예를 들어 실제 환경에서는 더 나은 효율성을 위해 3, 5, 4단계가 병렬로 실행될 수 있습니다. 위의 트리 다이어그램에서는 각 작업이 실행되는 순서를 확인하기 어렵습니다. 그러나 ORACLE에서 생성된 다른 형태의 실행 계획을 통해 어떤 작업이 먼저 실행되고 나중에 실행되는지 쉽게 알 수 있습니다. 실행계획은 우리에게 정말 필요한 부분인데, 나중에 자세히 설명하겠습니다.
이 기사는 CSDN 블로그에서 가져온 것입니다. 재인쇄할 때 출처를 표시하십시오: http://blog.csdn.net/lcyhjx/archive/2009/12/20/5044799.aspx
-