Oracle数据库查看执行计划的方式
执行计划:Oracle中查询语句的执行过程或访问路径的描述。
两。如何查看执行计划
1:查看F5下的SQL执行计划、第三方工具、蟾蜍等。
很多人都认为,PL的SQL执行计划只能看到基本信息,如基数、优化器、消费等等。事实上,这可以在PL/sql工具中设置,您可以看到许多其他信息,如下所示
2:在sql * Plus中执行以下步骤(在命令窗口中,在SQL SQL窗口中)
复制代码代码如下所示:
解释计划
SELECT * FROM SCOTT.EMP;- SQL脚本解析
SQL SELECT * FROM表>>(dbms_xplan。显示);
3:在SQL +下面执行以下命令(一些命令无效):
复制代码代码如下所示:
设置控制显示执行时间统计
SQL > SET AUTOTRACE ON解释这样的设置包括执行计划、脚本的数据输出,没有统计信息
sql执行需要查看执行计划的SQL语句。
SQL >设置AUTOTRACE --没有产生AUTOTRACE的报告,这是默认模式
SQL > SET AUTOTRACE ON -这样的设置包括执行计划、统计信息、数据和脚本的输出
sql执行需要查看执行计划的SQL语句。
SQL >设置AUTOTRACE关闭
SQL >设置AUTOTRACE痕迹-此设置将有执行计划,统计,和无脚本的数据输出
sql执行需要查看执行计划的SQL语句。
SQL >设置AUTOTRACE痕迹统计--这个设置只包含统计信息
sql执行需要查看执行计划的SQL语句。
autot { } {比赛设置了{唯一} } {口痕迹{ } { } {等在统计| | } }
参考文献:sqlplus用户指南和参考版本11.1
注:PL / SQL开发工具不完全支持所有SQL*Plus命令,如SET AUTOTRACE ON,那么它将PL / SQL开发工具下执行此命令错误。
SQL > SET AUTOTRACE ON;
不能设置AUTOTRACE
4:sql_trace可以启用全球作为一个参数,也可以在一个特定的会话形式的命令的形式使
4.1在全球在参数文件启用(pfile / SPFILE)在sql_trace =真正的指定,在全球sql_trace启用会导致之后所有的活动过程中,包括用户进程的背景和过程,往往会导致严重的性能退化,在生产环境中,谨慎使用。
提示:通过使sql_trace在全球范围内,我们可以跟踪所有后台进程的活动,以及许多抽象的描述文件。通过跟踪文件的实时变化,我们可以清楚地看到进程之间的紧密协调。
4.2,在当前的会话级设置中,通过跟踪当前进程,可以发现当前操作的后台数据库的递归操作(在研究数据库的新特性时特别有效),并在研究SQL执行时找出背景。
错误代码等:
SQL >改变会话设置sql_trace =真;
SQL> select * from SCOTT.EMP;
SQL >改变会话设置sql_trace = false;
那么,您如何看待此时的相关信息呢无论您在SQL + +或SQL开发人员中执行上面的脚本,在这之后您都看不到任何信息。可以通过以下脚本查询跟踪日志信息。
复制代码代码如下所示:
选择t.value | || |低(RTrim(i.instance,CHR(0))'_ora_| | | |)
p.spid'。trc'trace_file_name | |
从
(选择p.spid
从V mystat美元M,V $ SESSION,v$进程P
在m.statistic # = 1
和s.sid = m.sid
和p.addr = s.paddr
P),
(选择t.instance
从v $ t,v参数v
在v.name = 'thread
和(v.value = 0或t.thread # = to_number(v.value))
我),
(选择值的V参数name = 'user_dump_dest美元不)
tkprof的帮助信息如下:复制代码代码如下:
tkprof选项
选项说明
跟踪文件的跟踪输出文件的名称
输出文件的文件名已经建立
排序选项的顺序
打印前n语句
使用指定的用户名运行解释计划
文件名生成一个INSERT语句
sys =忽略作为用户系统运行的递归SQL语句
合计= { Y | n}不收取同样的如果没有指定tkprof骨料
SQL文本的多个用户
记录文件在跟踪文件中找到的语句
表= schema.tablename提出执行计划到一个指定的表而不是默认的plan_table
您可以键入tkprof在操作系统会列出所有可用的选项和输出
注释排序选项有
排序选项描述
对prscnt execnt fchcnt调用的数量分析的执行时间
从提取的CPU时间执行prscpu execpu fchcpu分析
prsela exela fchela分析以提取时间
对磁盘的数量prsdsk exedsk fchdsk读取分析提取的执行期间
对用于连续阅读提取的执行过程中的缓冲区的数目prsqry exeqry fchqry分析
对提取的执行过程中读取当前使用的缓冲区数prscu执行fchcu分析
高速缓存的数量prsmis exemis分析思念在图书馆在执行
在执行过程中对处理的行数exerow fchrow分析
对于一个光标分析用户用户名的用户ID
tkprof统计
执行调用号码
CPU使用的秒数:CPU
走过的总时间:去
磁盘:物理读取时间
查询的逻辑读取数:连续读取
当前当前模式中逻辑读取的数量:
行:已处理行号
tkprof统计信息
统计意义
语句的计数分析或执行语句的数目和提取调用的数目。
如果在0分析阶段的共享池中找到CPU中每个阶段的处理时间,则为秒。
以秒计算的占用时间通常不是很有用,因为其他进程影响占用时间。
如果数据被缓冲,从数据库文件读取的物理数据块可能非常低。
连续读取和检索查询的逻辑缓冲区通常用于SELECT语句。
当前检索当前模式通常用于DML语句的逻辑缓冲区
由行外部声明显示,SELECT语句的语句显示在DML语句的执行阶段,在执行阶段显示处理线
查询和当前的总数是访问的逻辑缓冲区的总数。
执行以下命令:tkprof D:甲骨文产品 10.2.0 db_1 RDBMS微量/ wgods_ora_3940.trc H: out.txtoutputfile解释= / ETL ETL
执行上述命令后,您可以查看生成的文本文件。
复制代码代码如下所示:
tkprof:释放10.2.0.1.0生产在5月23日星期三16:56:41 2012
版权(c)1982, 2005,甲骨文。版权所有。
跟踪文件:D:甲骨文产品 10.2.0 db_1 RDBMS微量/ wgods_ora_3940.trc
排序选项:默认
********************************************************************************
次OCI程序数=数被处决
执行时的CPU时间
以秒为单位执行时间
磁盘=磁盘中物理缓冲区的读取次数
查询=一致读取得到的缓冲区的个数
当前=在当前模式下获取的缓冲区的数目(通常用于更新)
行=取或执行调用处理的行数。
********************************************************************************
改变会话设置sql_trace =真
调用计数CPU经过的磁盘查询当前行
-----------------------------------------------------------------------
解析0 0
执行10 0
取0 0
-----------------------------------------------------------------------
合计10 0
解析期间在库缓存中未命中:0
执行期间在库缓存中未命中:1
优化器模式:选择
解析用户ID:89(ETL)
********************************************************************************
开始:ID:= sys.dbms_transaction.local_transaction_id;结束;
调用计数CPU经过的磁盘查询当前行
-----------------------------------------------------------------------
解析20 0
执行20 0.000002
取0 0
-----------------------------------------------------------------------
合计40 0.000002
解析期间在库缓存中未命中:0
优化器模式:选择
解析用户ID:89(ETL)
********************************************************************************
*选择
从
scott.emp
调用计数CPU经过的磁盘查询当前行
-----------------------------------------------------------------------
解析20 0
执行10 0
取10 0.0007014
-----------------------------------------------------------------------
合计40 0.0007014
解析期间在库缓存中未命中:1
优化器模式:选择
解析用户ID:89(ETL)
行的执行计划
----------------------------------------------------------
选择语句模式:选择
表访问方式:分析(全)of'emp(表)
********************************************************************************
改变会话设置sql_trace = false
调用计数CPU经过的磁盘查询当前行
-----------------------------------------------------------------------
解析10 0
执行10 0
取0 0
-----------------------------------------------------------------------
合计20 0
解析期间在库缓存中未命中:1
优化器模式:选择
解析用户ID:89(ETL)
********************************************************************************
对于所有的非递推报表总数
调用计数CPU经过的磁盘查询当前行
-----------------------------------------------------------------------
解析50 0
Execute 50 0.000002
取10 0.0007014
-----------------------------------------------------------------------
合计110 0.0007016
解析期间在库缓存中未命中:2
执行期间在库缓存中未命中:1
所有递归语句的总计
调用计数CPU经过的磁盘查询当前行
-----------------------------------------------------------------------
解析0 0
执行0 0
取0 0
-----------------------------------------------------------------------
合计0 0
解析期间在库缓存中未命中:0
会话中的用户SQL语句。
会话中的内部sql语句。
会话中的sql语句。
本次会议解释的发言。
********************************************************************************
跟踪文件:D:甲骨文产品 10.2.0 db_1 RDBMS微量/ wgods_ora_3940.trc
跟踪文件的兼容性:10.01.00
排序选项:默认
会话跟踪文件。
跟踪文件中的用户SQL语句。
跟踪文件中的内部SQL语句。
跟踪文件中的SQL语句。
跟踪文件中唯一的SQL语句。
使用模式解释sql语句:
ETL教授plan_table美元。
使用默认表。
创建了表。
桌子掉了。
跟踪文件中的行。
跟踪文件中的秒数。
4.3,我们跟踪其他用户的进程。在许多情况下,我们需要跟踪其他用户的进程,而不是Oracle可以提供的当前用户。
dbms_system.set_sql_trace_in_session做。
例如:
复制代码代码如下所示:
选择SID,串行#,V $ SESSION么= 'etl的用户名
执行dbms_system.set_sql_trace_in_session(61,76,真的);
执行dbms_system.set_sql_trace_in_session(61,76,假);
5使用10046事件
复制代码代码如下所示:
改变会话设置tracefile_identifier = 10046;
改变会话设置事件= '10046道意,8级;
SELECT * FROM SCOTT.EMP;
改变会话设置事件= '10046微量命名上下文;
然后您可以使用脚本查看跟踪文件的位置。
选择t.value | || |低(RTrim(i.instance,CHR(0))'_ora_| | | |)
p.spid'。trc'trace_file_name | |
从
(选择p.spid
从V mystat美元M,V $ SESSION,v$进程P
在m.statistic # = 1
和s.sid = m.sid
和p.addr = s.paddr
P),
(选择t.instance
从v $ t,v参数v
在v.name = 'thread
和(v.value = 0或t.thread # = to_number(v.value))
我),
(选择值的V参数name = 'user_dump_dest美元不)
查询结果wgods_ora_28279.trc文件,但没有相应的跟踪文件,在相应的目录中找到,但下面的跟踪文件:wgods_ora_28279_10046.trc。
6使用10053事件
有点像10046,跳绳,
7系统观
通过下面的一些系统视图,您可以看到一些关于执行计划的零散信息,如果您感兴趣的话,您可以学习更多的信息。
复制代码代码如下所示:
SELECT * FROM V sql_plan美元
SELECT * FROM V rsrc_plan_cpu_mth美元
SELECT * FROM V sql_plan_statistics美元
SELECT * FROM V sql_plan_statistics_all美元
SELECT * FROM V sqlarea_plan_hash美元
SELECT * FROM V rsrc_plan_history美元
三。理解执行计划
1。执行顺序
该原则的执行顺序是:从上到下,从左到右。
自上而下:在计划的实施中一般包含多个节点,同一级(或并行)节点上的优先级由
在一个节点中,从右到左有多个子节点,开始执行子节点。
当然,您也可以通过它提供的功能来查看工具中的执行顺序:
2现场口译。执行计划
SQL >
名词解释:
递归调用递归调用
DB块数块读取缓冲区高速缓存块在当前请求的数量,电流模块的数量在运行就正常,但不一致读的情况下产生的,一个查询块是在查询的时间点在数据库查询中,当前块的现有的数据块,在这个时候,而不是之前或之后的数据块的个数这一次。
数据量的数据的一致性撤消一致得到在缓冲区中的回滚段的总请求数块缓冲区高速缓存读取所需的数据块的读,这里的概念是在您的处置当你需要阅读本操作状态对一致性处理多块,这些块的主要原因是因为你在查询过程中,由于操作的数据块的其他会议,和查询块已被修改,但因为我们的查询调用这些修改之前,一块在图像查询数据回滚段的需要,为了保证数据的一致性,这导致了一个一致的阅读。
物理读的物理读取是从磁盘读取的数据块的数量:
1:数据库缓存中不存在这些块。
2:全表扫描
3:磁盘分类
在重做的重做日志大小DML产生的大小
内存执行中的排序(内存)量
磁盘上执行排序(磁盘)的数量。
2091个字节通过网络发送给客户机,从SQL *网络发送2091字节的数据给客户机。
通过客户端客户端接收的416个字节发送416字节的数据到SQL *网络。
参考文献:sqlplus用户指南和参考版本11.1
DB块三个元素之间的关系、一致性获取和物理读取可以概括如下:逻辑读取指的是Oracle从内存中读取的数据块的数量,一般来说:
一致得到db块得到。当内存中没有所需的数据块时,可以从磁盘获得,然后生成物理读。
三.具体内容观
1 >计划散列值
此行是该语句的哈希值。我们知道Oracle在共享池中执行每个Oracle语句的执行计划,首先通过硬解析生成哈希值,在下次执行时比较散列值,如果相同的是不执行硬解析。
2 >成本
成本没有一个单位,是一个相对值,当SQL以CBO的方式分析执行计划时,它提供了Oracle来评估CBO的成本并选择执行计划。没有明确的含义,但它在对比中是非常有用的。
公式:成本=(单块我 / O成本+多块我 / O成本+ CPU成本)/ sreadtim
3 >执行计划列字段的解释:
id:执行序列,但它不是执行序列。根据操作缩进(最正确的第一个和第一个执行原则)判断执行。在同一个层次上,如果一个操作没有子,id是第一个执行的。一般来说,根据缩进的长度,缩进的第一个执行是最大的。如果2行缩进,则先执行以上操作。)
操作:当前操作的内容。
名称:操作对象
行:即10g版本之前的基数(基数),Oracle估计当前操作的返回结果集行数。
字节:执行此步骤后返回的字节数。
成本(CPU):表示执行到该步骤的执行成本,用于说明SQL执行的成本。
时间:Oracle估计当前操作的时间。
4。谓语说明:
谓词信息(由操作ID标识):
离开
2过滤器()。经理不为空)
4 -访问(。编号=B。经理)
访问:表示谓词条件的值将影响数据的访问路径(全表扫描或索引)。
筛选器:谓词条件的值不影响数据的访问路径,只起过滤作用。
谓词中访问的主要注意事项是考虑谓词的条件以及访问路径是否正确使用。
5。动态分析
如果在实施计划中有以下提示:
注
—
-用于声明的动态采样
这表明用户CBO使用的当前技术要求用户在分析计划时考虑到这些因素。
这里有两种情况:
(1)如果没有分析该表,则CBO可以通过动态抽样获得分析数据,或者能够或正确地执行计划。
(2)如果分析表,但分析信息太旧,CBO将不会使用动态采样,而是使用这些旧的分析数据,这可能导致错误的执行计划。
四、表访问模式
1全表扫描(FTS)全表扫描
2、索引查找索引扫描
索引查找有5种方法:
索引唯一扫描——索引唯一扫描
找到一个数值,通过一个独特的指标经常返回一个rowid。如果有唯一或主键约束,保证语句只访问一行,Oracle
独特的扫描规则
通过一个唯一的a查找一个键值的方法,也称为对错。
指数范围扫描-指数局部扫描
索引范围扫描是访问特定列的范围值的方法。至少必须提供索引的前导列以通过索引访问数据。可用于范围操作(例如。
使用索引来访问数据的多个行,通常使用索引范围扫描的唯一指标是谓语(约束)中使用的运算符号的范围(如> > < =,=,拼接)
索引全扫描-索引全局扫描
全索引扫描只能在CBO中获得,否则我们无法确定是否完整扫描是一个好主意。我们选择索引完全扫描时,我们有统计表明,它将是更有效的比一个完整的表扫描和排序。例如,当我们对索引进行无限扫描时,我们可以做一个完整的索引扫描,并希望索引中的数据有序。
索引快速全扫描-索引快速全局扫描,经常发生没有顺序的
扫描所有的块索引,行不在排序顺序返回v733_plans_enabled =真正需要介绍7.3和CBO,可能暗示使用index_ffs提示,使用多块我 / O,可以并行执行,可以用来访问第二列因为连接索引。这是我们选择的所有索引。
索引跳过扫描-索引跳转扫描,其中条件列通常没有索引。
索引跳过扫描查找行,即使列不是
3。ROWID物理ID扫描
这是最快的访问方法。Oracle检索指定的块,第一次扫描是访问数据的最快方式。