首页 > sql_trace的介绍

sql_trace的介绍

sql_trace的介绍



--打开trace文件设置,把sql trace设置为true,就会在udump目录中增加一个trc文件。

alter session set sql_trace=true;

show parameter sql_trace;(select * from v$parameter where name='sql_trace';)

修改后不生效呢?show parameter sql_trace;其参数始终是FALSE

    show parameter sql_trace是从v$parameter中取相应参数,而v$parameter是体现了全部的init.ora的内容。而show user应该是取的当前会话的参数。

sql_trace 是可以在系统或会话级上启用,并且产生很多输出,系统级应该是直接改init了,会话级就用alter session set sql_trace = true来生效。ISSES_MODIFIABLE=false应该是说明在会话一级上,不能启用系统一级的跟踪

    如果修改系统的参数,用如下语句:

alter system set sql_trace=true;

    此时在查看show parameter sql_trace;可看到sql_trace的value值为TRUE

--对跟踪文件做标记

alter session set tracefile_identifier='look_for_me'; --

在D:oracleproduct10.2.0adminfgisdbudump路径下可以找到标记为look_for_me的跟踪文件

--停止该会话的跟踪

alter session set sql_trace=false;

 

 

--查看跟踪文件名

select d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||

       p.spid || '.trc' trace_file_name

  from (select p.spid

          from v$mystat m, v$session s, v$process p

         where m.statistic# = 1

           and s.sid = m.sid

           and p.addr = s.paddr) p,

       (select t.instance

          from sys.v$thread t, sys.v$parameter v

         where v.name = 'thread'

           and (v.value = 0 or t.thread# = to_number(v.value))) i,

       (select value from v$parameter where name = 'user_dump_dest') d

 

 

TKPROF的介绍

 

    Tkprof是一个用于分析Oracle跟踪文件并且产生一个更加清晰合理的输出结果的可执行工具。如果一个系统的执行效率比较低,

一个比较好的方法是通过跟踪用户的会话并且使用Tkprof工具使用排序功能格式化输出,从而找出有问题的SQL语句。

Tkprof命令后面可以带各种类型的排序选项,具体如下:

Usage: tkprof tracefile outputfile [explain= ] [table= ][print= ] [insert= ] [sys= ] [sort= ]

参数说明:

tracefile:要分析的trace文件

outputfile:格式化后的文件

explain=user/password@connectstring

table=schema.tablename

     注1:这两个参数是一起使用的,通过连接数据库对在trace文件中出现的每条sql语句查看执行计划,并将之输出到outputfile中

     注2:该table必须是数据库中不存在的,如果存在会报错

print=n:只列出最初N个sql执行语句

insert=filename:会产生一个sql文件,运行此文件可将收集到的数据insert到数据库表中

sys=no:过滤掉由sys执行的语句

record=filename:可将非嵌套执行的sql语句过滤到指定的文件中去

waits=yes|no:是否统计任何等待事件

aggregate=yes|no:是否将相同sql语句的执行信息合计起来,默认为yes

sort= option:设置排序选项,选项如下:

    prscnt:number of times parse was called

    prscpu:cpu time parsing

    prsela:elapsed time parsing

    prsdsk:number of disk reads during parse

    prsqry:number of buffers for consistent read during parse

    prscu:number of buffers for current read during parse

    prsmis:number of misses in library cache during parse

    execnt:number of execute was called

    execpu:cpu time spent executing

    exeela:elapsed time executing

    exedsk:number of disk reads during execute

    exeqry:number of buffers for consistent read during execute

    execu:number of buffers for current read during execute

    exerow:number of rows processed during execute

    exemis:number of library cache misses during execute

    fchcnt:number of times fetch was called

    fchcpu:cpu time spent fetching

    fchela:elapsed time fetching --要设置初始化参数time_statistics=true

    fchdsk:number of disk reads during fetch

    fchqry:number of buffers for consistent read during fetch

    fchcu:number of buffers for current read during fetch

    fchrow:number of rows fetched

    userid:userid of user that parsed the cursor

可根据自己的需要设置排序

举例:

/*将生成的fgisdb_ora_1204_test.trc的跟踪文件转化为cc文件,条件:只列出前三个sql语句;生成insert.sql,运行该文件将数据保存至数据库;

提取sql语句,sqlstr.sql默认在执行该命令的路径;并且输出执行计划*/

C:Documents and SettingsAdministrator>tkprof D:oracleproduct10.2.0adminfgisdbudumpfgisdb_ora_1204_test.trc

c:cc.txt print=3 insert=c:insert.sql record=sqlstr.sql explain=gwm/gwm@fgisdb table=gwm.trace_test

sort=(prsela, exeela, fchela)

--sort选项可同时用多个,做法是用括号括起来,中间用逗号分割:

注意:最后排序是按照各个选项的数字之和进行排序,类似于order by (sort1+sort2+sort3),而不是order by sort1,sort2,sort3

分析tkprof文件:

CALL :每次SQL语句的处理都分成以下三个部分

         Parse:这步将SQL语句转换成执行计划,包括检查是否有正确的授权和所需要用到的表、列以及其他引用到的对象是否存在。



         Execute:这步是真正的由Oracle来执行语句。对于insert、update、delete操作,这步会修改数据,对于select操作,这步就只是确定选择的记录。



         Fetch:返回查询语句中所获得的记录,这步只有select语句会被执行。



COUNT:这个语句被parse、execute、fetch的次数。



CPU:这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。



ELAPSED:这个语句所有消耗在parse、execute、fetch的总的时间。



DISK:从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。



QUERY:在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。一致性模式的buffer是用于给一个长时间运行的事务提供一个一致性读的快照, 

            缓存实际上在头部存储了状态。



CURRENT:在current模式下所获得的buffer的数量。一般在current模式下执行insert、update、delete操作都会获取 buffer。在current模式下如果在高速缓存

                区发现有新的缓存足够给当前的事务使用,则这些buffer都会被读入了缓存区中。



ROWS: 所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返回记录是在fetch这步,对于insert、update、delete操作,返回

           记录则是在execute这步。

 

A、query+current/rows 平均每行所需的block数,太大的话(超过20)SQL语句效率太低



B、Parse count/Execute count parse count应尽量接近1,如果太高的话,SQL会进行不必要的reparse



C、rows Fetch/Fetch Fetch Array的大小,太小的话就没有充分利用批量Fetch的功能,增加了数据在客户端和服务器之间的往返次数。



D、disk/query+current 磁盘IO所占逻辑IO的比例,太大的话有可能是db_buffer_size过小(也跟SQL的具体特性有关)



E、elapsed/cpu 太大表示执行过程中花费了大量的时间等待某种资源



F、cpu Or elapsed 太大表示执行时间过长,或消耗了了大量的CPU时间,应该考虑优化



G、执行计划中的Rows 表示在该处理阶段所访问的行数,要尽量减少

 

http://www.cnblogs.com/lanzi/archive/2011/01/14/1935558.html

转载于:https://www.cnblogs.com/chinhr/archive/2011/11/09/2243306.html

更多相关:

  • 零(将字符串转化成数字的函数)       int num = atoi(arr);      该函数具有把字符串转化成整型数的作用。 壹(vim显示行号)       Linux终端下直接输入vim   ~/.vimrc,打开是一个空白的页面,然后进入插入模式,直接输入set nu,然后保存并退出,以      后每次  ...

  • windows下 Source Monitor代码度量工具的使用 引用链接: https://www.cnblogs.com/xuehanyu/p/4520965.html 1.总体介绍 SourceMonitor是一款免费的软件,运行在Windows平台下。它可对多种语言写就的代码进行度量,包括C、C++、C#、Java、V...

  •   python基础知识(二)   (二)常用控制流 1、控制语句 分支语句:起到一个分支分流的作用,类似马路上的红绿灯 循环语句:for while 可以使代码不断重复的执行   2、判断语句:关键字是if..elif..else  a、if条件语句后面可以接比较运算、逻辑运算、成员运算;当if后面的语句满足条件,允许的结果是Tru...

  • 1.Python : 是一门解释型 弱类型 高级开发编程语言. 2.第一个Python程序的编写: print ("hell,world") 3.变量:把程序运行过程中的值储存起来,方便后面的程序调用. 4.变量的命名要求: 1,只能是数字或字母或下划线组成; 2,不能是数字开头,也不能全是数字; 3,不能是Python的关键字; 4...

  • 一 程序的三种基本结构              顺序结构:程序从上往下依次执行,这个叫顺序结构         分支结构:有选择的执行或者不执行某段代码         循环结构:重复的执行某段代码 二 分支结构之if 最简单的俩种用法   (tips: if语句后面的大括号可以省略:如果省略:那么这个if语句只能管理离它最近的那...

  • Python是一种计算机程序设计语言,它是一种动态的、面向对象的脚本语言。它是一种跨平台的,可以运行在 Windows,Mac和 Linux/Unix系统上。在日常使用中需要对大量数据进行数据分析,那么就必然用到数据库,我们常用的数据库有 SQL Server , MySQL , Oracle , DB2 , SQLite ,Hive...

  • 在VS下用C语言连接SQLServer2008 原文:在VS下用C语言连接SQLServer2008 step1:启动SQLSERVER服务 step2:打建立数据库test,在test库中建立test表(a varchar(200),b varchar(200))  step3:建立系统DSN,开始菜单 ->运行 ->o...

  • 打开SQL Server Configuration Manager,在SQL server配置管理器展开SQL server 2005网络配置-->SQLEXPRESS 的协议-->双击TCP/IP协议-->ip地址将1433端口启用,重启下MSSQL服务才能生效,示例图: 重启下MSSQL服务才能生效 转载于:https:/...

  • 一.ITL(Interested Transaction List):   ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag,lck和scn/fsc组成,用来记录该块所有发生的事务,一个itl可以看作是一条...

  • 转自http://blog.chinaunix.net/space.php?uid=16981447&do=blog&cuid=430716做了简单的格式整理,加入了一点点原创的东西。Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选...

  • 问题描述: 已知一个使用字符串表示的非负整数num,将num中的k个数字移 除,求移除k个数字后,可以获得的最小的可能的新数字。 例如:num = “1432219” , k = 3 在去掉3个数字后得到的很多很多可能里,如1432、4322、2219、1219 、1229…; 去掉数字4、3、2得到的1219最小! 贪心规律:...

  • 一个谜团 如果你用过类似guava这种“伪函数式编程”风格的library的话,那下面这种风格的代码对你来说应该不陌生: 1 2 3 4 5 6 7 8 9 public void tryUsingGuava() { final int expectedLength = 4; Iterables.filter(...

  • http://en.wikipedia.org/wiki/Condition_number...