【发布时间】:2017-01-21 18:44:30
【问题描述】:
3 个表:employees(emp_id、dept_id、job_id、emp_fname、emp_lname、salary、address、email)、departments(dept_id,d_name) 和 jobs(job_id,j_title)。
员工(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)|时间 |
------------------------------------------------------------------------------------------------
| 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 |
谓词信息(由操作id标识): -------------------------------------------------- -
5 - filter("E"."SALARY">30000)
7 - access("E"."JOB_ID"="J"."JOB_ID")
8 - access("E"."DEPT_ID"="D"."DEPT_ID")
--------------------------------------------------------------------------
- 第 5,7 和 9 步的 * 是什么意思?
- 3 个嵌套循环在这里的作用是什么?
- 步骤 7 和 6 在同一个循环中。为什么第 8 步和第 9 步在执行类似工作时会处于不同的循环中?
- 谁能解释一下每个步骤的作用?
【问题讨论】:
-
这些是指关于应该出现在计划下方的那些步骤的附加优化器注释。
-
您能详细说明一下吗? @JeffreyKemp
-
您尚未将整个解释计划复制到您的问题中。编辑您的问题以提供缺失的信息,也许我们可以为您提供帮助。
-
@JeffreyKemp 完成。请帮忙!