Oracle中获取执行计划的几种方法分析

 我来答
天罗网17
2022-10-27 · TA获得超过6190个赞
知道小有建树答主
回答量:306
采纳率:100%
帮助的人:73.2万
展开全部
以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍 需要的朋友可以参考下  

   预估执行计划 Explain Plan Explain plan以SQL语句作为输入 得到这条SQL语句的执行计划 并将执行计划输出存储到计划表中 首先 在你要执行的SQL语句前加explain plan for 此时将生成的执行计划存储到计划表中 语句如下 explain plan for SQL语句 然后 在计划表中查询刚刚生成的执行计划 语句如下 select * from table(dbms_xplan display); 注意 Explain plan只生成执行计划 并不会真正执行SQL语句 因此产生的执行计划有可能不准 因为

   )当前的环境可能和执行计划生成时的环境不同 )不会考虑绑定变量的数据类型 )不进行变量窥视

   查询内存中缓存的执行计划 (dbms_xplan display_cursor) 如果你想获取正在执行的或刚执行结束的SQL语句真实的执行计划(即获取library cache中的执行计划) 可以到动态性能视图里查询 方法如下

   )获取SQL语句的游标 游标分为父游标和子游标 父游标由sql_id(或联合address和hash_value)字段表示 子游标由child_number字段表示

  如果SQL语句正在运行 可以从v$session中获得它的游标信息 如 select status sql_id sql_child_number from v$session where status= ACTIVE and

  如果知道SQL语句包含某些关键字 可以从v$sql视图中获得它的游标信息 如 select sql_id child_number sql_text from v$sql where sql_text like %关键字%‘

   )获取库缓存中的执行计划 为了获取缓存库中的执行计划 可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等 但更方便的方法是以sql_id和子游标为参数 执行如下语句 select * from table(dbms_xplan display_cursor( sql_id child_number));

   )获取前一次的执行计划 set serveroutput off select * from table(dbms_xplan display_cursor(null null ALLSTATS LAST ));

   查询历史执行计划(dbms_xplan display_awr) AWR会定时把动态性能视图中的执行计划保存到dba_hist_sql_plan视图中 如果你想要查看历史执行计划 可以采用如下方法查询 select * from table(dbms_xplan display_awr( sql_id );

   在用sqlplus做SQL开发是(Autotrace) set autotrace是sqlplus工具的一个功能 只能在通过sqlplus连接的session中使用 它非常适合在开发时测试SQL语句的性能 有以下几种参数可供选择

  SET AUTOTRACE OFF 不显示执行计划和统计信息 这是缺省模式 SET AUTOTRACE ON EXPLAIN 只显示优化器执行计划 SET AUTOTRACE ON STATISTICS 只显示统计信息 SET AUTOTRACE ON 执行计划和统计信息同时显示 SET AUTOTRACE TRACEONLY 不真正执行 只显示预期的执行计划 同explain plan 生成Trace文件查询详细的执行计划 (SQL_Trace ) SQL_TRACE 作为初始化参数可以在实例级别启用 也可以只在会话级别启用 在实例级别启用SQL_TRACE会导致所有进程的活动被跟踪 包括后台进程及所有用户进 程 这通常会导致比较严重的性能问题 所以在一般情况下 我们使用sql_trace跟踪当前进程 方法如下

  SQL>alter session set sql_trace=true; 被跟踪的SQL语句 SQL>alter session set sql_trace=false; 如果要跟踪其它进程 可以通过Oracle提供的系统包DBMS_SYSTEM SET_SQL_TRACE_IN_SESSION来实现 例 SQL> exec dbms_system set_sql_trace_in_session(sid serial# true) 开始跟踪 SQL> exec dbms_system set_sql_trace_in_session(sid serial# false) 结束跟踪

lishixinzhi/Article/program/Oracle/201311/19003

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式