过sql_trace跟踪得到了该SQL的执行计划,如何看懂执行计划
通过sql_trace跟踪得到了该SQL的执行计划,但不会看,请大家教我如何看懂执行计划
下面是一条SQL的执行计划,能详细说说各个信息代表什么意思吗?
这是执行的SQL语句,索引建立的是列ORDDATE + UNIT_PRICE的复合索引
select /*+ index(ord ix_ord_odate_uprice) */ *
from ord
where unit_price in (2000, 3000, 5000)
and orddate like '1997%'
下面的是跟踪得到的执行计划,就是看不懂
Call Count CPU Time Elapsed Time Disk Query Current Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse 1 0.000 0.000 0 0 0 0
Execute 1 0.000 0.000 0 0 0 0
Fetch 481 0.047 0.059 0 1424 0 4800
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total 483 0.047 0.059 0 1424 0 4800
解释:
Parse: 这步将SQL语句转换成执行计划,包括检查是否有正确的授权和所需要用到的表、列以及其他引用到的对象是否存在。
Execute: 这步是真正的由Oracle来执行语句。对于insert、update、delete操作,这步会修改数据,对于select操作,这步就只是确定选择的记录。
Fetch: 返回查询语句中所获得的记录,这步只有select语句会被执行。
COUNT: 这个语句被parse、execute、fetch的次数。
CPU: 这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。
ELAPSED: 这个语句所有消耗在parse、execute、fetch的总的时间。
DISK: 从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
QUERY: 在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。 一致性模式的buffer是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。
CURRENT: 在current模式下所获得的buffer的数量。一般在current模式下执行insert、update、delete操作都会获取buffer。在current模式下如果在高速缓存区发现有新的缓存足够给当前的事务使用,则这些buffer都会被读入了缓存区中。
ROWS: 所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返回记录是在fetch这步,
对于insert、update、delete操作,返回记录则是在execute这步。
Elapsed Time for Client(sec.): 0.182
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user: SQLT (ID=68)
Rows Row Source Operation
------- ---------------------------------------------------
0 STATEMENT
4800 TABLE ACCESS BY INDEX ROWID ORD
4800 INDEX RANGE SCAN IX_ORD_ODATE_UPRICE OF IX_ORD_ODATE_UPRICE (NONUNIQUE)
下面是一条SQL的执行计划,能详细说说各个信息代表什么意思吗?
这是执行的SQL语句,索引建立的是列ORDDATE + UNIT_PRICE的复合索引
select /*+ index(ord ix_ord_odate_uprice) */ *
from ord
where unit_price in (2000, 3000, 5000)
and orddate like '1997%'
下面的是跟踪得到的执行计划,就是看不懂
Call Count CPU Time Elapsed Time Disk Query Current Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse 1 0.000 0.000 0 0 0 0
Execute 1 0.000 0.000 0 0 0 0
Fetch 481 0.047 0.059 0 1424 0 4800
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total 483 0.047 0.059 0 1424 0 4800
解释:
Parse: 这步将SQL语句转换成执行计划,包括检查是否有正确的授权和所需要用到的表、列以及其他引用到的对象是否存在。
Execute: 这步是真正的由Oracle来执行语句。对于insert、update、delete操作,这步会修改数据,对于select操作,这步就只是确定选择的记录。
Fetch: 返回查询语句中所获得的记录,这步只有select语句会被执行。
COUNT: 这个语句被parse、execute、fetch的次数。
CPU: 这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。
ELAPSED: 这个语句所有消耗在parse、execute、fetch的总的时间。
DISK: 从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
QUERY: 在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。 一致性模式的buffer是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。
CURRENT: 在current模式下所获得的buffer的数量。一般在current模式下执行insert、update、delete操作都会获取buffer。在current模式下如果在高速缓存区发现有新的缓存足够给当前的事务使用,则这些buffer都会被读入了缓存区中。
ROWS: 所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返回记录是在fetch这步,
对于insert、update、delete操作,返回记录则是在execute这步。
Elapsed Time for Client(sec.): 0.182
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user: SQLT (ID=68)
Rows Row Source Operation
------- ---------------------------------------------------
0 STATEMENT
4800 TABLE ACCESS BY INDEX ROWID ORD
4800 INDEX RANGE SCAN IX_ORD_ODATE_UPRICE OF IX_ORD_ODATE_UPRICE (NONUNIQUE)