2016-09-14 5 views
1

직원 (emp_id, dept_id, job_id, emp_fname, emp_lname, 급여, 주소, 전자 메일), 부서 (dept_id, d_name) 및 작업 (job_id, j_title) 3 개의 테이블.오라클의 explain plan에서 몇 가지 단계는 무엇을 의미합니까?

직원 (emp_id), 부서 (dept_id) 및 작업 (job_id)의 고유하지 않은 색인.

SQL> explain plan for 
select d.d_name, j.j_title, count(1) 
from employees e join departments d on e.dept_id=d.dept_id 
join jobs j on e.job_id=j.job_id 
where e.salary>30000 
group by d.d_name, j.j_title; 

SQL>select * from table(DBMS_XPLAN.display); 

---------------------------------------------------------------------------------- 

| 이드 | 운영 | 이름 | 행 | 바이트 | 비용 (% CPU) | 시간 | (동작 id에 의해 식별 됨)

------------------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT | | 10 | 890 | 4 (25)| 00:00:01 | 
| 1 | HASH GROUP BY | | 10 | 890 | 4 (25)| 00:00:01 | 
| 2 |  NESTED LOOPS | | | | | | 
| 3 |  NESTED LOOPS | | 10 | 890 | 3 (0)| 00:00:01 | 
| 4 |   NESTED LOOPS | | 10 | 640 | 3 (0)| 00:00:01 | 
|* 5 |   TABLE ACCESS FULL | EMPLOYEES | 10 | 390 | 3 (0)| 00:00:01 | 
| 6 |   TABLE ACCESS BY INDEX ROWID| JOBS | 1 | 25 | 0 (0)| 00:00:01 | 
|* 7 |   INDEX RANGE SCAN | JOBS_JOB_ID | 1 | | 0 (0)| 00:00:01 | 
|* 8 |  INDEX RANGE SCAN | DEPT_DEPT_ID | 1 | | 0 (0)| 00:00:01 | 
| 9 |  TABLE ACCESS BY INDEX ROWID | DEPARTMENTS | 1 | 25 | 0 (0)| 00:00:01 | 

술어 정보 : --------------------------------- ------------------

5 - filter("E"."SALARY">30000) 

7 - access("E"."JOB_ID"="J"."JOB_ID") 

8 - access("E"."DEPT_ID"="D"."DEPT_ID") 

-------------------------------------------------------------------------- 
  1. 단계 5,7 및 9 * 무엇을 의미합니까?
  2. 여기서 3 중첩 루프의 역할은 무엇입니까?
  3. 7 단계와 6 단계는 동일한 루프에 있습니다. 유사한 작업을 수행 할 때 8 단계와 9 단계가 다른 루프에있는 이유는 무엇입니까?
  4. 누구든지 각 단계에서 무엇을 설명 할 수 있습니까?
+1

다음은 계획 아래에 나타나야하는 단계에 대한 추가 옵티 마이저 참고 사항입니다. –

+0

정교하게 주시겠습니까? @JeffreyKemp –

+0

귀하의 질문에 전체 Explain 계획을 복사하지 않았습니다. 누락 된 정보를 제공하기 위해 질문을 수정하십시오. 그러면 우리가 귀하를 도울 수 있습니다. –

답변

2

제프리 (Jeffrey)가 언급했듯이 이들은 실행 계획에 대한 몇 가지 추가 정보입니다. 그들은 보통 where/like (기타) 조건 및 HASH JOINS (기타 일지 모르지만 확실하지 않음)으로 표시됩니다. 기본적으로 어디에서나 옵티마이 저는 Explain Plan의 출력에 넣을 수없는 추가 정보를 제공하기를 원합니다.

아래와 같이 실행하여 직접 복제 할 수 있습니다.

EXPLAIN PLAN FOR 
your_query; 

그런 다음

----------------------------------------------------------------------------------- 
| Id | Operation  | Name   | Rows | Bytes | Cost (%CPU)| Time  | 
----------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |    | 17 | 187 |  2 (0)| 00:00:01 | 
|* 1 | INDEX RANGE SCAN| EMP_DATA_ENAME | 17 | 187 |  2 (0)| 00:00:01 | 
----------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - access("ENAME" LIKE 'ZM%') 
     filter("ENAME" LIKE 'ZM%') 
1
| 4 |   NESTED LOOPS | | 10 | 640 | 3 (0)| 00:00:01 | 
|* 5 |   TABLE ACCESS FULL | EMPLOYEES | 10 | 390 | 3 (0)| 00:00:01 | 
5 - filter("E"."SALARY">30000) 

EMPLOYEES 테이블의 모든 행을 조회 할 것이다 (내 경우)

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 

출력을 실행하고 SALARY에 지정된 필터와 일치하는 계획의 다음 단계로 보내질 것입니다.

| 6 |   TABLE ACCESS BY INDEX ROWID| JOBS | 1 | 25 | 0 (0)| 00:00:01 | 
|* 7 |   INDEX RANGE SCAN | JOBS_JOB_ID | 1 | | 0 (0)| 00:00:01 | 
7 - access("E"."JOB_ID"="J"."JOB_ID") 

5 단계에서 방출 된 각 행에는 직원 용 JOB_ID이 포함되어 있습니다. JOBS_JOB_IDJOB_ID에 대해 프로빙되고 (단계 7), ROWID는 JOBS 테이블에서 해당 행을 검색하는 데 사용됩니다 (6 단계).

| 3 |  NESTED LOOPS | | 10 | 890 | 3 (0)| 00:00:01 | 
|* 8 |  INDEX RANGE SCAN | DEPT_DEPT_ID | 1 | | 0 (0)| 00:00:01 | 
8 - access("E"."DEPT_ID"="D"."DEPT_ID") 

EMPLOYEES 표 (5 이전 단계에서 검색된)로부터 DEPT_ID

이제 DEPT_DEPT_ID 지수 (단계 8)을 조사하기 위해 사용된다.

| 2 |  NESTED LOOPS | | | | | | 
| 9 |  TABLE ACCESS BY INDEX ROWID | DEPARTMENTS | 1 | 25 | 0 (0)| 00:00:01 | 

DEPT_DEPT_ID 인덱스에서 ROWID는 이제 부서 테이블에서 행을 검색하는 데 사용됩니다.

| 0 | SELECT STATEMENT | | 10 | 890 | 4 (25)| 00:00:01 | 
| 1 | HASH GROUP BY | | 10 | 890 | 4 (25)| 00:00:01 | 

결과는 갈수록 각 레코드를 카운트 (+ j.j_titled.d_name에 기초하여 키를 사용하는) 해쉬 테이블에 투입된다. 마지막 레코드가 검색되면 해시 테이블이 스캔되어 각 d_name, j_title의 수를 반환합니다.

+0

고마워요! :) 또한 7 단계와 6 단계가 같은 루프에 있다고 말할 수 있습니까? 유사한 작업을 수행 할 때 8 단계와 9 단계가 다른 루프에있는 이유는 무엇입니까? –

+0

특별한 이유가 없습니다 - explain plan은 옵티 마이저의 디버그 출력이며, 그 단점을 가지고 있습니다. 때때로 유사한 실행 계획과 약간 다른 패턴을 얻을 수 있습니다. –