oracle编程入门笔记2015-01-22--解释计划
2015-01-22 13:58
344 查看
在进行开发时,遇到性能问题调优经常要看执行计划。但是执行计划需要sql实际执行后才能获取。有时候使用替代方案解释计划来近似代替最终的执行计划。
1.获取解释计划的方法。
a,用plsql developer中sql 窗口直接按快捷键F5就可以看到。其他图形化工具类似
里面字段的意思可以就不解释了。太多了,用到了再查,多查几次就记住了。
b.使用命令
explain plan for (sql语句):自动生成解释计划添加到plan_table表中。
接下来,你可以统计自己编写sql语句去plan_table 表中查询,但是实际情况是我在plan_table 中没有找到任何记录。但是切换到sys账户使用dba权限是可以查看的。
而且一个解释结果生成的不是一条记录。是多行记录,分别记录了每一步执行情况,包括数据库内部的一些查询。
其实直接查看结果往往不方便,所以oracle提供了一个方法将结果格式化,dbms_xplan.display这个函数有四个参数,都有默认值,如果不传入参数就查询最近一条解释结果。
用法select * from table(dbms_xplan.display);
解释计划特点
1.解释计划不需要正在执行,所以不会影响数据库。返回结果也比较快
2.解释计划因为没有真正执行,所以得到的结果与真正的执行计划是有一定差异的,但是,在关键步骤上差异不大。所以在开发过程中用起来比较方便,在后期针对特定sql调优过程中可能会因为信息不全导致力不从心。
c.使用set autotrace on;
使用该命令,生效后。执行
解释计划为什么不能等同于执行计划?
1.解释计划是根据当时数据库收集的统计信息计算出来的最优执行计划。但是数据库始终变化的,所以真正执行的时候可能数据环境已经不一样了
2.解释计划对所有的绑定变量统一判断为varchar2.并且不会理会绑定变量的实际值。
举例
解释计划:
执行计划:由于某种原因,没有获取到。以后补上。
之前使用
步骤1:alter session set statistics_level=all ;
步骤2:在此处执行你的SQL
步骤3:select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
这种方式获取执行计划是因为我打开了serveroutput,关闭就可以了。
如果serveroutput 为on,那么没执行完一条sql语句最后一定会隐式执行dbms_output的方法。所以获取最后执行的sql执行计划总会保存,提示你sql id 不对。
最明显的错误在于,预估的返回行是错误的。实际返回为0.实际执行过。我只是想说明解释计划与执行计划不完全一样。
1.获取解释计划的方法。
a,用plsql developer中sql 窗口直接按快捷键F5就可以看到。其他图形化工具类似
里面字段的意思可以就不解释了。太多了,用到了再查,多查几次就记住了。
b.使用命令
explain plan for (sql语句):自动生成解释计划添加到plan_table表中。
接下来,你可以统计自己编写sql语句去plan_table 表中查询,但是实际情况是我在plan_table 中没有找到任何记录。但是切换到sys账户使用dba权限是可以查看的。
而且一个解释结果生成的不是一条记录。是多行记录,分别记录了每一步执行情况,包括数据库内部的一些查询。
其实直接查看结果往往不方便,所以oracle提供了一个方法将结果格式化,dbms_xplan.display这个函数有四个参数,都有默认值,如果不传入参数就查询最近一条解释结果。
用法select * from table(dbms_xplan.display);
解释计划特点
1.解释计划不需要正在执行,所以不会影响数据库。返回结果也比较快
2.解释计划因为没有真正执行,所以得到的结果与真正的执行计划是有一定差异的,但是,在关键步骤上差异不大。所以在开发过程中用起来比较方便,在后期针对特定sql调优过程中可能会因为信息不全导致力不从心。
c.使用set autotrace on;
使用该命令,生效后。执行
解释计划为什么不能等同于执行计划?
1.解释计划是根据当时数据库收集的统计信息计算出来的最优执行计划。但是数据库始终变化的,所以真正执行的时候可能数据环境已经不一样了
2.解释计划对所有的绑定变量统一判断为varchar2.并且不会理会绑定变量的实际值。
举例
解释计划:
执行计划:由于某种原因,没有获取到。以后补上。
之前使用
步骤1:alter session set statistics_level=all ;
步骤2:在此处执行你的SQL
步骤3:select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
这种方式获取执行计划是因为我打开了serveroutput,关闭就可以了。
如果serveroutput 为on,那么没执行完一条sql语句最后一定会隐式执行dbms_output的方法。所以获取最后执行的sql执行计划总会保存,提示你sql id 不对。
最明显的错误在于,预估的返回行是错误的。实际返回为0.实际执行过。我只是想说明解释计划与执行计划不完全一样。
相关文章推荐
- oracle编程入门笔记2015-01-23--执行计划
- oracle编程入门笔记2015-01-18--执行计划中的索引扫描方式说明
- oracle编程入门笔记2015-01-08--查询
- oracle编程入门笔记2015-01-13--数据库原理1之硬解析软解析
- oracle编程入门笔记2015-01-30--model子句性能
- oracle编程入门笔记2015-01-09--插入
- oracle编程入门笔记2015-02-05--递归查询
- oracle编程入门笔记2015-01-26--分析函数使用举例
- oracle编程入门笔记2015-01-12--数据合并
- oracle编程入门笔记2015-01-19--表连接
- oracle编程入门笔记2015-01-17--一个例子告诉你共享池和数据缓存对效率的影响
- oracle编程入门笔记2015-01-06--sqlplus
- oracle编程入门笔记2015-01-12--数据库原理1
- oracle编程入门笔记2015-01-19--index fast full scan
- oracle编程入门笔记2015-01-28--model子句原理
- oracle编程入门笔记2015-01-25--浅说cube
- oracle编程入门笔记2015-01-27--分析函数性能
- oracle编程入门笔记2015-01-18--常用oracle查询语句
- oracle编程入门笔记2015-01-14--查询转换
- oracle编程入门笔记2015-01-10--更新,删除