SQL调优之二:如何阅读执行计划
这里不讲每一步在做什么,那样子会让你很混乱。
刚开始阅读执行计划,只要遵循以下三个原则,一步一步读就可以了。
- 执行计划的阅读顺序是先从右往左,再从上往下。在看执行计划的时候,你先找到缩进最多的那一行,也就是最右,然后往回读。如果有多行缩进一样的,则遵循从上往下的顺序阅读。有些执行计划可能很复杂,有时候可能看错,可以通过UE的光标判断。
- 连接操作通常会有两个数据集,你阅读的顺序是从上往下。所以第一个数据集是驱动集,第二个数据集则是被探查表。在嵌套循环连接方式里,第一个数据集就是外部表。在哈希连接中,第一个数据集则用来构建哈希表。
- 同一时间只会做一次连接,所以任何时候都只需要考虑两个数据集和他们的连接操作。
比如以下的执行顺序是4, 5, 3, 6, 2, 9, 10, 8, 7, 1, 0,嵌套循环连接外部表是DEPARTMENTS, 哈希连接的哈希表是EMP_NAME_IX过滤出来的结果集
--------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 570 | 7 (15)| 00:00:01 | |* 1 | HASH JOIN | | 10 | 570 | 7 (15)| 00:00:01 | | 2 | NESTED LOOPS | | | | | | | 3 | NESTED LOOPS | | 10 | 380 | 4 (0)| 00:00:01 | |* 4 | TABLE ACCESS FULL | DEPARTMENTS | 1 | 16 | 3 (0)| 00:00:01 | |* 5 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 10 | | 0 (0)| 00:00:01 | | 6 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 10 | 220 | 1 (0)| 00:00:01 | | 7 | VIEW | index$_join$_004 | 107 | 2033 | 3 (34)| 00:00:01 | |* 8 | HASH JOIN | | | | | | | 9 | INDEX FAST FULL SCAN | EMP_NAME_IX | 107 | 2033 | 1 (0)| 00:00:01 | | 10 | INDEX FAST FULL SCAN | EMP_EMP_ID_PK | 107 | 2033 | 1 (0)| 00:00:01 | ---------------------------------------------------------------------------------------------------
Reference:
https://oracle-base.com/articles/9i/dbms_xplan#reading-execution-plans