Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全
该文档为根据相关资料整理、总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威、最正确的方法、步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅使用,因本人未发现本博客支持附件上传功能,需要PDF文件格式的朋友可向我要,也可到群里下载,转载请注明出处。
1、查询v$sql_plan:
SQL> col "Query Plan_Table" format a100
SQL> select id,lpad(' ', 2*(level-1))||operation||''||options||' '||object_name||' '||decode(id, 0, 'Cost='||cost) "QueryPlan_Table"
fromv$sql_plan
startwith id = 0
andsql_id = '&&sql_id'
andplan_hash_value = &&plan_hash
connect byprior id = parent_id
andsql_id = '&&sql_id'
andplan_hash_value = &&plan_hash;
--注::SQL_ID可查v$sqltext和dba_hist_sqltext,也可通过其他途径获得。
2、通过包DBMS_XPLAN
1)DISPLAY
SQL>explain plan for select * from t_users whereuser_id='TEST';
SQL>select * from table(dbms_xplan.display());
SQL>select * fromtable(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));
--注:
1.TABLE_NAME:存储查询计划的表名,默认值为PLAN_TABLE。
2.STATEMENT_ID :SQL 语句ID。可在执行ExplainPlan 命令时,通过SetStatement_
id 子句来指定。如为NULL,则取最近一条被解释的语句。
3.FORMAT:输出格式。在DISPLAY 函数中,有以下预定义格式选:
1)'BASIC' :基本格式。输出的内容最少,仅输出查询计划中每个操作的ID、名称和选项及操作对象名。
2)'TYPICAL':典型格式。除了基本格式中的内容外,还输出每个操作的记录行数、
字节数、代价和时间,以及相关的提示信息(如远程SQL、优化器建议等)。如
存在谓词,还输出每个操作中的过滤条件和访问条件。此外,如涉及分区表,还输出分区裁剪信息;如涉及并行查询,还输出并行操作信息(如表队列信息、并行查询分布方式等)。为默认格式。
3)'SERIAL':串行执行格式。这种格式和典型格式的输出内容基本一致,不同之处在于,对并行查询,它不会输出相关的并行内容。
4)'ALL':完全格式。输出的内容相对完整。除了典型格式的内容以外,还会输出字段投影信息和别名信息。
此外,用户还可通过在格式化字符串中添加或屏蔽一些关键词进行细化输出,
例如:“BASICROWS”,“TYPICAL-PREDICATE”等
1)ROWS:优化器估算出的记录行数;
2)BYTES:优化器估算出的字节数;
3)COST:优化器估算出的代价;
4)PARTITION:分区裁剪;
5)PARALLEL:并行查询;
6)PREDICATE:谓词;
7)PROJECTION:字段投射;
8)ALIAS:别名;
9)REMOTE:分布式查询信息;
10)NOTE:相关注释信息。
2)DISPLAY_CURSOR
SQL>select /*+gather_plan_statistics*/* fromt_users where user_id='TEST';
SQL>select * fromtable(dbms_xplan.display_cursor(null,null,'BASIC LAST ALLSTATS'));
--注:
1.DISPLAY_CURSOR 函数可以显示内存中一个或者多个游标的执行计划;
2.用户须对视图V$SQLV、$SQL_PLAN 和V$SQL_PLAN_STATISTICS_ALL 的SELECT有权限;
3.参数:
1)SQL_ID:如果没有指定SQL_ID(指定NULL),则默认会显示当前会话中最后一条执行的SQL 语句。
2)CURSOR_CHILD_NO:语句的子游标序号,如果不指定,则会显示该语句的所有子游标的执行计划。
3)FORMAT:格式化控制字符串。DISPLAY 函数的格式化控制字符串的所有选项都适用于DISPLAY_CURSOR 函数。如运行语句时通过GATHER_PLAN_STATISTICS或设置系统参数STATISTICS_LEVEL 为“ALL”收集语句运行的性能统计数据,则在细化选项中还有额外的选项,以选择是否输出这些数据。
4)IOSTATS:是否输出计划的输入输出(IO)统计数据;
5)MEMSTATS :在启用了PGA 自动管理的情况下,是否输出计划的输入内存统计数据(内存使用量、内存读次数等);
6)ALLSTATS:包含了IOSTATS和MEMSTATS 的全部内容;
7) LAST :以上三个选项输出的是该游标所有执行所产生的数据的总和。也可增加LAST选项以限定仅显示最后一次运行的统计数据。
此外,还有一些选项可用于该函数的输出控制:
8)'ADVANCED' :高级格式。高级格式除了会输出完全格式中的所有内容外,还会视情况输出绑定变量窥视信息和计划概要信息;
9) OUTLINE:是否以提示方式显示计划概要;
10)PEEKED_BINDS:是否显示绑定变量窥视信息;
11)BUFFSTATS:是否显示内存读次数(包括一致性读和当前读次数),该信息为IOSTATS 的一部分;
12)PLAN_HASH:是否显示计划的哈希值,该选项同样适用于DISPLAY函数。
3)DISPLAY_AWR
SQL>select sql_id, to_char(substr(sql_text,0,2000))
fromdba_hist_sqltext
whereupper(sql_text) like 'SELECT * FROM TEST%';
SQL>select * fromtable(dbms_xplan.display_awr('&sql_id'));
--注:
1.DISPLAY_AWR 函数显示存储在AWR历史数据的执行计划。
2.须对以下视图有SELECT权限:DBA_HIST_SQL_PLAN 和DBA_HIST_SQLTEXT。
3.参数:
1)SQL_ID :可以从DBA_HIST_SQL_PLAN.SQL_ID或DBA_HIST_SQLTEXT.SQL_ID 获得,该参数必须指定非空值,没有默认值;
2)PLAN_HASH_VALUE :如果该参数未指定或为NULL,则会显示语句的所有执行计划;
3)DB_ID:指定显示哪个数据库的执行计划,默认为本地数据库ID。页可将其他数据库的AWR导入本地库进行分析。
4)FORMAT:格式化控制字符串。与DISPLAY的相同选项类似。
4)DISPLAY_SQLSET
SQL>declare
2 ss_name varchar2(60);
3 begin
4 ss_name :=dbms_sqltune.create_sqlset();
5 dbms_sqltune.capture_cursor_cache_sqlset(ss_name,600,100);
6 dbms_output.put_line(ss_name);
7 end;
8 /
SQL>select sqlset_name,sql_id,sql_text fromDBA_SQLSET_STATEMENTS where upper(sql_text)
like 'SELECT * FROM TEST%';
SQL>select * fromtable(dbms_xplan.display_sqlset('STS_6','abcdefg',null,'BASIC ROWS COST'));
--注:
1.DISPLAY_SQLSET函数显示存储在一个SQL调优集中的语句的执行计划。
2.参数:
1)SQLSET_NAME:SQL 集的名称。每个SQL 集都有一个单独的名称(可在创建时
用户指定,也可系统自动生成),需指定从哪个SQL集中读取和显示语句的执行计划,该参数没有默认值,必须指定;
2)SQL_ID :可从USER/DBA/ALL_SQLSET_PLANS.SQL_ID获得,该参数必须指定非空值,没有默认值;
3)PLAN_HASH_VALUE:如果未指定或为NULL,则会显示语句的所有执行计划;
4)FORMAT:格式化控制字符串。与DISPLAY的FORMAT 选项相同;
5)SQLSET_OWNER:SQL集的所有者,默认为当前用户名。
5)DISPLAY_SQL_PLAN_BASELINE
SQL>select * fromtable(dbms_xplan.display_sql_plan_baseline(sql_handle =>
'SYS_SQL_66cc81707e560a32'));
--注:
1.DISPLAY_SQL_PLAN_BASELINE 函数显示存储在数据字典当中SQL 执行计划基线的计划。
2.参数:
1)SQL_HANDLE:执行计划基线所属SQL的句柄名称,由Oracle在创建或载入执行计划到基线当中时自动生成,可以通过视图dba_sql_plan_baselines查询,默认为NULL;
2)PLAN_NAME :执行计划基线中某个执行计划的名称,由Oracle 创建或载入执行计划到基线当中时自动生成,可以通过视图dba_sql_plan_baselines查询,默认为NULL;
3)FORMAT :格式化控制字符串。DISPLAY_SQLSET 函数的格式化选项与DISPLAY
的选项相同。
4)当SQL_HANDLE和PLAN_NAME 都为空时,显示所有基线数据中的全部执行计划。
3、AUTOTRACE
1)配置test用户使用autot
SQL>conn sys/sys as sysdba
SQL>@?/SQLPLUS/ADMIN/PLUSTRCE.SQL
SQL>grant plustrace totest;
2)使用方法
1.SET AUTOTRACE ON:打开AUTOTRACE,并输出所有内容,包括语句本身的查询结果、执行计划,以及性能统计数据。
2.SET AUTOTRACE ON EXPLAIN :打开AUTOTRACE,并输出语句本身的查询结果和执行计划,不输出性能统计数据。
3.SET AUTOTRACE ON STATISTICS :打开AUTOTRACE,并输出语句本身的查询结果和性能统计数据,不输出执行计划。
4.SET AUTOTRACE TRACE :打开AUTOTRACE,并输出执行计划和性能统计数据,不输出语句本身的查询结果。
5.SET AUTOTRACE TRACE EXPLAIN :打开AUTOTRACE,并输出执行计划,不输出语句本身的查询结果和性能统计数据。
6.SET AUTOTRACE TRACESTATISTICS:打开AUTOTRACE,并输出性能统计数据,不输出语句本身的查询结果和执行计划。
7.SET AUTOTRACE OFF:关闭AUTOTRACE。
4、其他方法
1)SQL_TRACE(或者10046 跟踪事件):该方法会在跟踪文件里显示执行计划及相关统计信息:
SQL>alter session set sql_trace=true;
SQL>select * from t_users where user_id=’TEST’;
SQL>alter session set sql_trace=false;
SQL>select distinct spid from v$process p,v$session s, v$mystat m where p.addr=s.paddr and s.sid=m.sid;
SQL>show parameter user_dump_dest
SQL>ed/home/oracle/admin/ora10g/udump/ora10g_ora_sid.trc
2)OPTIMIZER_TRACE(或者10053 跟踪事件):该方法会在跟踪文件里记录优化器分析选择执行计划的过程:
SQL>alter session set"_optimizer_trace"=ALL;
SQL>explain plan for select * from t_users whereusername=’TEST’;
SQL>alter session set"_optimizer_trace"=NONE;
SQL>select distinct spid from v$process p,v$session s, v$mystat m where p.addr=s.paddr and s.sid=m.sid;
SQL>ed/home/oracle/admin/ora10g/udump/ora10g_ora_sid.trc
Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全相关推荐
- oracle数据库性能调优技术--深入理解散列连接执行计划
一.概述 这篇文章是数据库性能调优技术系列的第四篇.上一篇文章讲解了深入理解嵌套循环连接执行计划. 上一篇文章中提到两张表的连接有三种执行方式:1)嵌套循环连接:2)散列连接:3)归并连接.散列连接是 ...
- oracle sql 执行计划分析_Oracle SQL调优系列之看懂执行计划explain
1.文章写作前言简介 SQL调优系列博客链接:SQL调优专栏 之前曾经拜读过<收获,不止sql调优>一书,此书是国内DBA写的一本很不错的调优类型的书,是一些很不错的调优经验的分享.虽然读 ...
- Oracle Hints,Oracle并行模式(Parallel) /*+parallel(t,4)*/ 在SQL调优中的重要作用
/*+parallel(t,4)*/在SQL调优中的重要作用! 2013年11月17日 12:59:24 雾里看花5566 阅读数:5422更多 个人分类: 数据库-oracle 谈谈HINT /*+ ...
- oracle避免回表,请教大家: 经常在sql调优过程中提到避免“回表”,具体是指什么意思???3Q...
你的位置: 问答吧 -> Oracle -> 问题详情 请教大家: 经常在sql调优过程中提到避免"回表",具体是指什么意思???3Q 如题,不甚感激!!!! [ 本帖 ...
- 11g新特性-自动sql调优(Automatic SQL Tuning)
11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...
- 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解
<高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...
- oracle sql 分区查询语句_Oracle SQL调优之分区表
一.分区表简介 分区通过让您将它们分解为更小且更易于管理的分区(称为分区)来解决支持非常大的表和索引的关键问题.不需要修改SQL查询和DML语句以访问分区表.但是,在定义分区之后,DDL语句可以访问和 ...
- 面试中sql调优的几种方式_面试方式
面试中sql调优的几种方式 The first question I ask someone in an interview for a cybersecurity position is, &quo ...
- Mysql高级调优篇——第五章:Sql调优在面试中深度剖析
上节讲了Sql调优实战,本章聊聊面试中Sql调优深度的剖析场景! 在讲之前我们先做一些准备工作,建立一些需要用到的表: Mysql高级调优篇表补充--建表SQL_风清扬逍遥子的博客-CSDN博客⭐️t ...
最新文章
- matlab 如何定义符号数组
- 大型软件公司.net面试题!
- jquery饼状图插件的指引线_JQuery图表插件Highcharts示例教程
- mybatis-plus排除非表中字段
- 使用tensorwatchimport pdb import tensorwatch as tw import torchvision.models alexnet_model = torchv可视化
- PowerShell实战5: 批量增加AD组成员
- 【ADO.NET】7、SQL高级封装
- : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
- Python(循环)求方差并将结果组成数组
- 英文演讲稿(3-5分钟)
- 计算机毕业设计之java+ssm乐轩公司订餐系统
- Weak Pointer
- SDN:简述对各类SDN交换机的认识
- HTML5七夕情人节表白网页制作 (蓝色主题-樱花雨3D相册)HTML+CSS+JavaScript
- 【漏洞学习——SQL】华图教育某分站SQL注入漏洞
- 亚信卸载-无需密码卸载
- 网站三大标签是什么? 网页三大标签在优化中分别有什么作用?
- Advances in Financial Machine Learning 导言 (附pdf下载链接)
- 在Junit调试中,出现警告: Method 'public void classname' could not be resolved.并报initializationError错误
- n行Python代码系列专栏文章目录
热门文章
- python怎么修改默认路径_修改默认python
- 跨越40多年的“以太”风云,了解一下?
- 夫妻合伙创业,度过艰苦的时期,酒楼生意蒸蒸日上
- html文件怎么转换成mp3,HTML 音频
- WLAN AC+AP部署(AC旁挂在核心)
- 盐城射阳中等专业学校北大青鸟强化班怎么样?来听听学生们怎么说吧!
- 添加默认网关route add default gw
- Python实现桌面挂件,做一只可爱的桌面宠物~
- 牧牛区块链培训,区块链赋能生态环境的监管
- mysql之case...when...then...end使用