如何看执行计划
2017-04-17 16:19
92 查看
如何看执行计划
下面举例进行解释
SQL> explain plan for
2 select a.name,b.name
3 from t1 a,t2 b
4 where a.id=b.id
5 and a.id='1';
Explained.
SQL> set lines 200
SQL> set pagesize 0
SQL> select * from table(dbms_xplan.display());
Plan hash value: 2680223496
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 20 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 10 | 1 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | T1_PK | 1 | | 0 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | T2 | 1 | 10 | 4 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."ID"=1)
4 - filter("B"."ID"=1)
17 rows selected.
对于Oracle执行计划,并列的行从上往下执行,非并列的行,靠右的先执行。
例如本例中:
id为3的操作最靠右,所以最先执行,其次是id为2和4的操作较靠右,而且并列,那么按照并列从上往下执行的原则,id为2的操作比id为4的操作先执行。
然后执行id为1的操作。
那么本例中执行计划按id排序为 3>2>4>1
---------------------------------------------------------------------------------------------------------------
本例中使用的DBMS_XPLAY显示的执行计划,其中:
id:为每个操作的唯一序列号,
operation:为每个操作的名称和方式,
name:是操作对象
Rows:Oracle估算当前操作影响的行数
bytes:Oracle估算当前操作的影响的数据量(单位byte)
Cost:Oracle计算出来的执行该操作的代价
Time:Oracle估算出来的该操作花费的时间
-----------------------------------------------------------------------------------------------------------------
id为0的操作为SELECT STATEMENT表示这条语句的类型为一条select语句,而非一个真实的操作。
id为1的操作表示它需要对id为2和4的操作得来的结果集以嵌套循环的方式进行数据关联。
id为2的操作是TABLE ACCESS BY INDEX ROWID,name是T1,表示它是通过索引的ROWID来访问表T1的。而索引上的ROWID则需要通过其子操作3来获取。
id为3的操作是INDEX UNIQUE SCAN,name是T1_PK表明那是通过主键唯一键值来获取其父操作2需要的Rowid。
id为4的操作是TABLE ACCESS FULL,name是T2,表明是对T2做的一个全表扫描。
注意:id为3和4的前面有*,表示这个操作有谓词条件:访问条件(access)或过滤条件(filter)
如上面的
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."ID"=1)
4 - filter("B"."ID"=1)
访问条件access和过滤条件filter的区别
访问条件是帮助操作在对象上定位到符合条件的数据,然后再读取数据。
过滤条件是操作已经从对象上获取了数据,然后根据条件将不符合要求的数据过滤掉。
下面举例进行解释
SQL> explain plan for
2 select a.name,b.name
3 from t1 a,t2 b
4 where a.id=b.id
5 and a.id='1';
Explained.
SQL> set lines 200
SQL> set pagesize 0
SQL> select * from table(dbms_xplan.display());
Plan hash value: 2680223496
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 20 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 10 | 1 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | T1_PK | 1 | | 0 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | T2 | 1 | 10 | 4 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."ID"=1)
4 - filter("B"."ID"=1)
17 rows selected.
对于Oracle执行计划,并列的行从上往下执行,非并列的行,靠右的先执行。
例如本例中:
id为3的操作最靠右,所以最先执行,其次是id为2和4的操作较靠右,而且并列,那么按照并列从上往下执行的原则,id为2的操作比id为4的操作先执行。
然后执行id为1的操作。
那么本例中执行计划按id排序为 3>2>4>1
---------------------------------------------------------------------------------------------------------------
本例中使用的DBMS_XPLAY显示的执行计划,其中:
id:为每个操作的唯一序列号,
operation:为每个操作的名称和方式,
name:是操作对象
Rows:Oracle估算当前操作影响的行数
bytes:Oracle估算当前操作的影响的数据量(单位byte)
Cost:Oracle计算出来的执行该操作的代价
Time:Oracle估算出来的该操作花费的时间
-----------------------------------------------------------------------------------------------------------------
id为0的操作为SELECT STATEMENT表示这条语句的类型为一条select语句,而非一个真实的操作。
id为1的操作表示它需要对id为2和4的操作得来的结果集以嵌套循环的方式进行数据关联。
id为2的操作是TABLE ACCESS BY INDEX ROWID,name是T1,表示它是通过索引的ROWID来访问表T1的。而索引上的ROWID则需要通过其子操作3来获取。
id为3的操作是INDEX UNIQUE SCAN,name是T1_PK表明那是通过主键唯一键值来获取其父操作2需要的Rowid。
id为4的操作是TABLE ACCESS FULL,name是T2,表明是对T2做的一个全表扫描。
注意:id为3和4的前面有*,表示这个操作有谓词条件:访问条件(access)或过滤条件(filter)
如上面的
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."ID"=1)
4 - filter("B"."ID"=1)
访问条件access和过滤条件filter的区别
访问条件是帮助操作在对象上定位到符合条件的数据,然后再读取数据。
过滤条件是操作已经从对象上获取了数据,然后根据条件将不符合要求的数据过滤掉。
相关文章推荐
- 如何查看oracle sql执行计划
- 如何执行一个SOA治理计划
- 从一个SQL使用了不理想的执行计划说开,浅谈执行计划如何估算cache信息的影响及系统统计信息的收集等(2010-10-15)
- oracle--如何干预执行计划(使用hints提示)
- oracle--如何分析执行计划
- 如何启用AutoTrace 查看SQL执行计划
- oracle--如何干预执行计划(使用hints提示)
- 如何查看执行计划
- 如何使用SQLPLUS分析SQL语句(查询执行计划跟踪)
- oracle优化7(如何干预执行计划 - hints)
- oracle如何查看执行计划
- 如何分析执行计划
- 如何改变oracle的执行计划(HINT)
- 如何在存储执行中,查询某条sql语句的执行计划。
- 如何看懂ORACLE执行计划
- 有时一个表的某个字段明明有索引,当观察一些语句的执行计划确不走索引呢?如何解决 ?
- 优化 SQL Server 查询性能----分析执行计划,索引与索引视图,如何识别要优化的查询
- 如何查看sql的执行计划
- 如何观察SQL Server 生成和重用执行计划
- 如何分析执行计划