作为一个B/S开发者,或多或少都得和数据库打交道,而对数据库的操作归根到底都是query语句,所有到最后都是为了查询,那么查看sql性能又成了我们开发中的一件趣事。下面简单介绍下sql_trace的使用:
alter session set sql_trace =true ;--打开sql_trace
select * from (select * from t order by id) where rownum <= 10;--执行要查看性能的sql语句
alter session set sql_trace =true ;--关闭sql_trace
对,上面的这几句话就可以了,你只要把它打开,执行sql,关闭就OK啦。你别以为这样就万事大吉了,测试已经完成,但是我们还没有看到结果呢。别急,测试结果可不是在sql-plus中可以看到的,这里我们要用到另外一个oracle自带工具:TKPROF 。它的作用就是格式化sql_trace的测试结果。
sql_trace生成的数据是以文件形式存储,该文件的具体位置可以用下面的sql查找出来
connect / as sysdba--以管理员登入(PS:我的数据库直接执行抛出表不存在的异常,所以用管理员登入)
SELECT d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
p.spid || '.trc' trace_file_name
from (select p.spid
from sys.v$mystat m, sys.v$session s, sys.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 sys.v$parameter where name = 'user_dump_dest') d
connect / as sysdba--以管理员登入(PS:我的数据库直接执行抛出表不存在的异常,所以用管理员登入)SELECT d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
p.spid || '.trc' trace_file_name
from (select p.spid
from sys.v$mystat m, sys.v$session s, sys.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 sys.v$parameter where name = 'user_dump_dest') d
然后再dos下执行
D:/oracle/product/10.1.0/Db_1/BIN>tkprof D:/oracle/product/10.1.0/admin/super/udump/super_ora_4504.trc D:/tttt.txt
D:/oracle/product/10.1.0/Db_1/BIN>tkprof D:/oracle/product/10.1.0/admin/super/udump/super_ora_4504.trc D:/tttt.txt
tttt.txt就是最终结果,打开后可以开到类似下面的数据
********************************************************************************
select *
from
(select * from t order by id) where rownum <= 10
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.06 0.19 944 949 0 10
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.06 0.20 944 949 0 10
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 71
Rows Row Source Operation
------- ---------------------------------------------------
10 COUNT STOPKEY (cr=949 pr=944 pw=0 time=199638 us)
10 VIEW (cr=949 pr=944 pw=0 time=199613 us)
10 SORT ORDER BY STOPKEY (cr=949 pr=944 pw=0 time=199589 us)
100000 TABLE ACCESS FULL T (cr=949 pr=944 pw=0 time=836305 us)
********************************************************************************
********************************************************************************select *
from
(select * from t order by id) where rownum <= 10call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.06 0.19 944 949 0 10
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.06 0.20 944 949 0 10Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 71 Rows Row Source Operation
------- ---------------------------------------------------
10 COUNT STOPKEY (cr=949 pr=944 pw=0 time=199638 us)
10 VIEW (cr=949 pr=944 pw=0 time=199613 us)
10 SORT ORDER BY STOPKEY (cr=949 pr=944 pw=0 time=199589 us)
100000 TABLE ACCESS FULL T (cr=949 pr=944 pw=0 time=836305 us)********************************************************************************
最后转载下tkprof的简单介绍
TKPROF 选项
选项 说明
TRACEFILE 跟踪输出文件的名称
OUTPUTFILE 已设置格式的文件的名称
SORT=option 语句的排序顺序
PRINT=n 打印前 n 个语句
EXPLAIN=user/password 以指定的用户名运行 EXPLAIN PLAN
INSERT=filename 生成 INSERT 语句
SYS=NO 忽略作为用户 sys 运行的递归 SQL 语句
AGGREGATE=[Y|N] 如果指定 AGGREGATE = NO TKPROF 不聚集相同
SQL 文本的多个用户
RECORD=filename 记录在跟踪文件中发现的语句
TABLE=schema.tablename 将执行计划放入指定的表而不是缺省的PLAN_TABLE
可以在操作系统中键入 tkprof 以获得所有可用选项和输出的列表
注 排序选项有
排序 选项说明
prscnt execnt fchcnt 调用分析执行提取的次数
prscpu execpu fchcpu 分析执行提取所占用的 CPU 时间
prsela exela fchela 分析执行提取所占用的时间
prsdsk exedsk fchdsk 分析执行提取期间的磁盘读取次数
prsqry exeqry fchqry 分析执行提取期间用于持续读取的缓冲区数
prscu execu fchcu 分析执行提取期间用于当前读取的缓冲区数
prsmis exemis 分析执行期间库高速缓存未命中的次数
exerow fchrow 分析执行期间处理的行数
userid 分析游标的用户的用户 ID
TKPROF 统计数据
Count: 执行调用数
CPU: CPU 的使用秒数
Elapsed: 总共用去的时间
Disk: 物理读取次数
Query: 持续读取的逻辑读取数
Current: 当前模式下的逻辑读取数
Rows: 已处理行数
TKPROF 统计信息
统计 含义
Count 分析或执行语句的次数以及为语句发出的提取调用数
CPU 每个阶段的处理时间以秒为单位如果在共享池中找到该语句对于分析阶段为 0
Elapsed 占用时间以秒为单位通常不是非常有用因为其它进程影响占用时间
Disk 从数据库文件读取的物理数据块如果该数据被缓冲则该统计可能很低
Query 为持续读取检索的逻辑缓冲区通常用于 SELECT 语句
Current 在当前模式下检索的逻辑缓冲区通常用于 DML 语句
Rows 外部语句所处理的行对于 SELECT 语句在提取阶段显示它对于 DML 语句在执行阶段显示它
Query 和Current 的总和为所访问的逻辑缓冲区的总数
TKPROF 选项
选项 说明
TRACEFILE 跟踪输出文件的名称
OUTPUTFILE 已设置格式的文件的名称
SORT=option 语句的排序顺序
PRINT=n 打印前 n 个语句
EXPLAIN=user/password 以指定的用户名运行 EXPLAIN PLAN
INSERT=filename 生成 INSERT 语句
SYS=NO 忽略作为用户 sys 运行的递归 SQL 语句
AGGREGATE=[Y|N] 如果指定 AGGREGATE = NO TKPROF 不聚集相同
SQL 文本的多个用户
RECORD=filename 记录在跟踪文件中发现的语句
TABLE=schema.tablename 将执行计划放入指定的表而不是缺省的PLAN_TABLE
可以在操作系统中键入 tkprof 以获得所有可用选项和输出的列表
注 排序选项有
排序 选项说明
prscnt execnt fchcnt 调用分析执行提取的次数
prscpu execpu fchcpu 分析执行提取所占用的 CPU 时间
prsela exela fchela 分析执行提取所占用的时间
prsdsk exedsk fchdsk 分析执行提取期间的磁盘读取次数
prsqry exeqry fchqry 分析执行提取期间用于持续读取的缓冲区数
prscu execu fchcu 分析执行提取期间用于当前读取的缓冲区数
prsmis exemis 分析执行期间库高速缓存未命中的次数
exerow fchrow 分析执行期间处理的行数
userid 分析游标的用户的用户 ID
TKPROF 统计数据
Count: 执行调用数
CPU: CPU 的使用秒数
Elapsed: 总共用去的时间
Disk: 物理读取次数
Query: 持续读取的逻辑读取数
Current: 当前模式下的逻辑读取数
Rows: 已处理行数
TKPROF 统计信息
统计 含义
Count 分析或执行语句的次数以及为语句发出的提取调用数
CPU 每个阶段的处理时间以秒为单位如果在共享池中找到该语句对于分析阶段为 0
Elapsed 占用时间以秒为单位通常不是非常有用因为其它进程影响占用时间
Disk 从数据库文件读取的物理数据块如果该数据被缓冲则该统计可能很低
Query 为持续读取检索的逻辑缓冲区通常用于 SELECT 语句
Current 在当前模式下检索的逻辑缓冲区通常用于 DML 语句
Rows 外部语句所处理的行对于 SELECT 语句在提取阶段显示它对于 DML 语句在执行阶段显示它
Query 和Current 的总和为所访问的逻辑缓冲区的总数