使用EXPLAN和STOREDOUTLINES.ppt
《使用EXPLAN和STOREDOUTLINES.ppt》由会员分享,可在线阅读,更多相关《使用EXPLAN和STOREDOUTLINES.ppt(127页珍藏版)》请在三一办公上搜索。
1、查找和修补有错误的查询时在很大程度上要借助于合适的工具。不同的场合有不同的工具,我们下面就来研究这些工具。1、Oracle的SQL TRACE实用程序这个实用程序在一个跟踪文件中记录了数据库的所有活动,我们需要使用tkprof实用程序转换成可读取的格式。,使用SQL trace的一个例子,1、下面的三个参数很重要,允许在系统中执行跟踪,2、对一个会话启用跟踪,这样这个会话就会被跟踪,select spid,s.sid,s.serial#,p.username,p.programfrom v$process p,v$session swhere p.addr=s.paddrand s.sid=(
2、select sid from v$mystat where rownum=1)/当前会话的sid和serial#,如果这个参数是false,那么每一个会话都会产生一个trace文件,然后所有的操作都会被trace,这样将会产生大量的trace文件,建议不要使用这个选项。,如何定位产生的trace文件呢?1、在当前会话中,运行下面的语句,得出当前的spidselect spid,s.sid,s.serial#,p.username,p.programfrom v$process p,v$session swhere p.addr=s.paddrand s.sid=(select sid fro
3、m v$mystat where rownum=1)/2、看一下文件的生成日期3、在会话中执行一个特殊一些的命令,例如Select Mytest from dual;然后使用grep等在文件堆中进行筛选。,TKPROF程序将SQL TRACE所生成的trace文件转换成可阅读的格式。,这个实用工具的使用方法,1、tracefile:包含了SQL_TRACE统计信息的TRACE文件名2、Output_file:输出文件名字3、print=number:包含在输出结果中的语句数量,如果没有列出来,那么默认所有语句都列出来4、explain=username/passwd:在trace文件里对用户的
4、sql语句运行explain plan,这个选项可以创建自己的plan_table,这样用户就需要创建表和创建表所需要的空间的特权,在tkprof运行结束以后会删除这个表,确保使用运行查询的用户,从而确保由正确的用户进行解释5、insert=filename:这个选项生成脚本来创建表并为每个所跟踪的SQL语句存储TRACE文件统计6、record=filename:这个选项将生成一个保存用户所有SQL语句的文件7、sys=ye/no:这个选项可以在输出结果中不显示递归SQL语句。递归SQL就是一些为了完成用户操作所进行的一些对数据字典的访问和操作。例如为了执行插入操作,首先需要一个递归操作:分
5、配一个extent给表所在的段。,8、sort=parameter有大量的排序选项可用:FCHCPU(获取的CPU时间)、FCHDSK(获取的磁盘读取)、FCHCU和FCHQRY(获取的内存读取)、FCHROW(取出的行数)、EXEDSK(执行期间的磁盘读取数)、EXECU和EXEQRY(执行期间的内存读取数)、EXEROW(执行时处理的行数)、EXECPU(执行的CPU时间)、PRSCPU(分析CPU)、PRSCNT(分析时间)9、waits=yes/no任何等待事件的记录概要10、aggregate=yes/no是否组合相同SQL文本的多个用户11、table=schema.table在将
6、执行计划写入到输出文件之前临时存放的位置,一个完整的小例子,按照CPU时间分析了两个最消耗CPU时间的SQL语句。包括执行计划。,忽略掉所有的递归语句,生成一个脚本,里面包括create table语句和insert语句。将跟踪记录插入到这个表中。但是这个脚本没有执行,我们可以另外打开一个窗口,然后运行这个脚本。,将整个会话中的SQL语句都抓出来。,显示4次磁盘读取(物理读取)共5491次(query+current),内存读取量是5491-4=5487这个查询中,磁盘读取不是大问题,因为几乎所有的读取都发生在内存中。,通过执行这个脚本,在这个用户下面建立了plan_table。,TRACE输
7、出部分1、SQL语句2、统计3、信息4、EXPLAIN PLAN(执行计划),1、SQL语句这个语句和执行的SQL语句完全相同。这个是输出的第一部分。,2、统计部分该部分包含了对这个SQL语句以及为了满足该语句而生成的所有递归SQL语句的统计。该部分有8个列组成。,第一列就是对数据库的调用类型分析(parse):硬分析或者软分析执行(execute):实际执行执行计划取出(fetch):获取结果数据后面7列是对上面三个选项的统计汇总。,1、count:这个类型的调用次数2、cpu:这条语句所有这种类型调用的总CPU时间,如果没有设置初始化参数timed_statistics设为true,那么c
8、pu和elapsed都为03、Elapsed:这个调用的总消耗时间4、disk:为了满足这次调用而从磁盘检索的数据块数目5、Query:进行这个类型调用时从内存检索的数据缓冲区数目主要指的是select6、current:进行这个类型调用时从内存检索的数据缓冲区数目主要指的update、insert、delete7、rows:这条语句处理的总行数,select语句所处理的行数都体现在fetch统计中,insert、update、delete都出现在execute行中,信息部分包含了有关分析和执行调用中丢失的库缓存的数量信息。如果这个丢失率很高,说明共享池的大小出现了问题,应当对库缓存的命中率和
9、重载率进行检查。优化器模式。分析这条语句使用的用户名字(执行这条语句的用户名)。,不同的执行步骤中所涉及的行的数目。,执行计划这是最有用的部分第一列是执行计划中每一行语句所处理的行数,在这里可以看到语句的执行情况。如果这里面处理的行数较多,那么就需要引起注意,看是否使用了全表扫描或者走了较差的索引。,查看TKPROF输出时可发现的问题分析数字太大应该增大shared pool磁盘读取量太高没有使用索引或根本没有索引Query或current太高(内存)索引位于低基数的列上。删除或者限制索引的使用,使用直方图、使用位图索引等可以解决这类问题。表的连接顺序出现问题也会出现这个问题分析所需要的时间太
10、多可能是open cursors的数量有问题EXPLAN PLAN里某一行语句要处理的行数相对其他行语句而言太多索引可能有问题、全表扫描在分析期间库缓存的Misses值大于1这表明需要重载这条语句,可以增加shared pool或者共享SQL语句,深入探讨TKPROF输出通过比较TKPROF输出和实际对象的物理特征,我们可以了解到oracle的工作原理。,已分配的块和已使用的块,没有任何信息。,分析以后就有数据了。,总共是1404个读取,其中磁盘就发生了281个读取。,注意:这个trace文件中,将两个相同的语句进行合并显示。,整个表都在内存中,多个5个数据块。,注意:全表扫描是Oracle控
11、制从内存中首先清除的内容之一(运行全表扫描以后他们将归为近期最少使用项LRU),这是因为他们效率非常低,通常还占用了大量的内存。,DBMS_MONITOR(10g新特性)在具有连接池或共享服务器的多层环境中,一个会话可能跨越多个进程,甚至跨越多个实例。DBMS_MONITOR是在oracle 10g中引入的内置的程序包,通过该程序包可以跟踪从客户机到中间层、再到后端数据库的任何用户会话,从而可以较为容易的标识创建大量工作量的特定用户。要使用这个程序包需要具有DBA权限。,数据库服务器,中间应用服务器,客户机,端到端的应用程序跟踪可以基于如下:(到底让我跟踪谁啊?)会话:基于会话ID和序列号客户
12、端标识符:允许跨越多个会话设置跟踪,基于登录ID指定终端用户。使用DBMS_SESSION.SET_IDENTIFIER过程设置该值实例:基于实例名指定给定的实例服务名:指定一组相关的应用程序,使用DBMS_SERVICE.CREATE_SERVICE过程设置该值模块名:开发人员在其应用程序代码中使用DBMS_APPLICATION_INFO.SET_MODULE过程设置该值操作名:开发人员在其应用程序中使用DBMS_APPLICATION_INFO.SET_ACTION过程设置该值后面的三个跟踪选项是关联的,不可以在没有指定上面两个的情况下,指定最后一个。但是可以指定第一个、不指定后面两个。
13、也可以指定前面两个,但是不指定最后面一个。,1、基于会话ID和序列号设置跟踪,在一个会话中执行左面的语句启用跟踪。,在另外一个会话中,执行语句,执行的语句被跟踪。,跟踪当前会话。,基于客户端标识符设置跟踪1、验证客户端标识符,发现没有客户端标识符。,一个会话连接上来以后,设置自己的客户端ID,然后开始执行自己的SQL语句。,再次查询就可以查找到这个会话。,前面演示了根据一个会话的client_id来进行跟踪。,根据服务名、模块名、操作名来进行跟踪为了使用操作名,必须有对应的服务名、模块名为了使用模块名,必须有对应的服务名,我们首先来看一下服务名的概念。,数据库默认有一个服务名,这个服务名和数据
14、库的名字经常一样。,服务名字注册到listener中去。,SQLPLUS SYSTEM/SYSORCL,一个数据库,两个服务名:两个应用,分别连接到两个服务上,应用服务器1,应用服务器2,一个数据库另个服务名。,两个服务都注册到listener中。,不同的应用服务器通过不同的服务名连接到了数据库中。,凡是通过orcl1这个服务连接上来的所有的会话都被跟踪。,一共两个会话,那么就产生了两个跟踪文件。,设置模块名和操作名,这一点和设置client_id非常的相似。,对于模块名和操作名,需要应用程序专门设置。,通过这个视图可以看见有哪些trace目前处于打开状态。,使用trcsess将多个文件保存到
15、一个文件中(10g的新特性)使用这个新特性,可以有选择地从多个跟踪文件中提取跟踪数据,并且将这些跟踪数据基于会话ID或者模块名等标准保存到一个跟踪文件中。这个命令在连接池、共享服务器配置中特别有用。使用这个命令,可以获得属于某个用户会话的统一的跟踪信息。根据如下的一些标准创建统一跟踪文件1、会话ID2、客户端ID3、服务名4、模块名5、操作名,以空格分开,如果没有指定,那么默认使用当前目录下面的所有文件,文件名中可以使用通配符*。,根据某个标准,在指定的trc文件中进行搜寻,将符合标准条件的所有的数据提取出来,放置到一个文件中。,当前目录下面所有的以orcl1服务名连接到数据库的跟踪信息,都被
16、提取出来,放置到service_id.txt中。以某个标准从trc文件中提取数据。,数据提取出来以后,使用tkprof进行格式化输出。,开发人员可以使用EXPLAIN PLAN命令来查看orale优化器用来执行SQL语句的查询执行计划。这个命令对提高SQL语句的性能很有帮助,因为他不用真正执行SQL语句。他只是列出了所要使用的计划,并把这个计划插入到了一个表中。在使用这个命令之前,需要执行utlxplan.sql文件,创建相应的表(PLAN_TABLE)EXPLAIN PLAN 和TRACE的区别1、一个是真正的执行、一个不需要真正的执行2、如果一个SQL语句执行时间特别的长,就需要使用exp
17、lain plan,TRACE要跟踪一个运行4小时的查询,也就需要花费4个小时的跟踪设置ora参数文件创建plan_table表运行查询执行语句,填充plan_table运行tkprof除输出explain plan以外,还显示磁盘和内存读取数,EXPLAIN PLAN对一个运行4小时的查询执行EXPLAIN PLAN,并得出结果,所需时间不到1分钟创建plan_table表解释查询填充plan_table查询plan_table输出显示EXPLAIN PLAN,如何使用EXPLAIN1、运行utlxplan.sql脚本,创建plan_table,说明这个用户已经执行过这个脚本,不需要在执行,
18、如果这个用户下面没有这个表,那么这个用户需要执行这个脚本。,2、使用explain for执行语句,这个可以没有,有这个的目的就是如果有多个开发人员在使用这个表,互相之间在访问的时候,不会发生混淆。,Oracle已经提供了脚本供我们直接使用。,后者对并行查询有详细的解释。,select lpad(,2*(level-1)|operation|options|object_name|decode(id,0,Cost=|position)Query Plan from plan_tablestart with id=0 and statement_id=Mysqlconnect by prior
19、id=parent_idand statement_id=Mysql/,EXPLAIN PLAN从上至下读取和从下至上读取具体使用哪种方式读取取决于从PLAN_TABLE表中检索信息的查询编写方式。因此两个方式都对。select LPad(,2*(Level-1)|Level|.|Nvl(Position,0)|Operation|Options|Object_Name|Object_Type|Decode(id,0,Statement_Id|Cost=|Position)|cost|Object_Node Query Planfrom plan_tablestart with id=0 An
20、d statement_id=Mysqlconnect by prior id=parent_idand statement_id=Mysql/,启用AUTOTRACE,.,SET AUTOTRACE ON的作用如下:1、执行SELECT语句2、自动显示执行计划和一些统计信息,打开autotrace:执行结果、执行计划、统计信息不显示查询的输出结果仅显示执行计划仅显示统计信息,在分区模式下面使用的EXPLAIN PLAN建立一个分区表create table dept1(deptno number(2),dept_name varchar2(30)partition by range(dept
21、no)(partition d1 values less than(10),partition d2 values less than(20),partition d3 values less than(maxvalue)/insert into dept1 values(1,DEPT 1);insert into dept1 values(7,DEPT 7);insert into dept1 values(10,DEPT 10);insert into dept1 values(15,DEPT 15);insert into dept1 values(22,DEPT 22);create
22、index dept_index on dept1(deptno)local(partition d1,partition d2,partition d3)/,强制对两个分区进行全表扫描。,实际对全表所有分区进行了扫描。,select operation,options,id,object_name,partition_start start_p,partition_stop stopfrom plan_table/,无论是索引还是表,走的都是一个分区。这个语句的访问实现了分区的优势。我们通过这个start和stop可以非常清楚的知道分区的意义是否实现。这一个点很重要。,在不使用trace的情
23、况下查找大的硬盘或内存的读取量。这就需要使用v$sqlarea,select disk_reads,sql_textfrom v$sqlareawhere disk_reads 1000order by disk_reads;,查找磁盘读取量大于1000的SQL语句。,查找内存读取率大于1000的SQL语句。,select buffer_gets,sql_textfrom v$sqlareawhere buffer_gets 10000order by buffer_gets/,我们根据自己的系统的情况进行分析,确认一个边界值。然后寻找所有超过这个边界值语句。按照降序进行排序输出。对于有问题的
24、SQL语句进行分析的优化。,select disk_reads,sql_textfrom v$sqlareawhere disk_reads 10000order by disk_reads desc;DISK_READS SQL_TEXT12987 select order#,columns,types from orderswheresubstr(orderid,1,2)=:111131 select custid,city from customerwherecity=CHICAGO,这个输出结果表明有两个有问题的查询引起了大量磁盘读取。第一个就是使用SUBSTR函数使ORDERID函数
25、上的索引受到限制;第二个显示了CITY上缺少索引。,select buffer_gets,sql_textfrom v$sqlareawhere buffer_gets 200000order by buffer_gets desc;BUFFER_GETS SQL_TEXT300219 select order#,cust_no,from orderswhere division=1,输出结果表明有一个查询造成了过量的内存读取(300 219个数据块读入内存中)。在DIVISION上的索引有一个低的基数1,因此在此表中只有一个分区。此处发生的情况时读取整个索引,然后读取整个表。而且为了提高性能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 EXPLAN STOREDOUTLINES
链接地址:https://www.31ppt.com/p-6549096.html