前言
sql_trace 是我在工作中經常要用到的調優工具
因為數據庫慢原因的
統計如下信息(摘字官方文檔)
Parse
CPU and elapsed times
Physical reads and logical reads
Number of rows processed
Misses on the library cache
Username under which each parse occurred
Each commit and rollback
使用前需要注意的地方
SQL>alter session set titimed_statistics=true
SQL>alter system set max_dump_file_size=
SQL>alter system set max_dump_file_size=unlimited
SQL>alter system set user_dump_dest=/oracle/trace
數據庫級別
設置slq_trace參數為true會對整個實例進行跟蹤
SQL>alter system set sql_trace=true;
Session級別
當前會話
SQL>alter session set sql_trace=true;
SQL>alter session set sql_trace=false;
其他會話
通過oracle提供的系統包 DBMS_SYSTEM
SQL>execute dbms_system
SQL>execute dbms_system
注
得到trace文件後我們要用tkprof他進行格式化
Tkprof
tkprof的目的是將sql trace生成的跟蹤文件轉換成用戶可以理解的格式
格式
tkprof tracefile outputfile [optional | parameters ]
參數和選項(這裡只介紹最常用的
explain=user/password執行explain命令將結果放在SQL trace的輸出文件中
sys=[yes/no]確定系統是否列出由sys用戶產生或重調的sql語句
sort=sort_option按照指定的方法對sql trace的輸出文件進行降序排序
sort_option選項
prscnt按解析次數排序
prscpu按解析所花cpu時間排序
prsela按解析所經歷的時間排序
prsdsk按解析時物理的讀操作的次數排序
prsqry按解析時以一致模式讀取數據塊的次數排序
prscu按解析時以當前讀取數據塊的次數進行排序
execnt按執行次數排序
execpu按執行時花的cpu時間排序
exeela按執行所經歷的時間排序
exedsk按執行時物理讀操作的次數排序
exeqry按執行時以一致模式讀取數據塊的次數排序
execu按執行時以當前模式讀取數據塊的次數排序
exerow按執行時處理的記錄的次數進行排序
exemis按執行時庫緩沖區的錯誤排序
fchcnt按返回數據的次數進行排序
fchcpu按返回數據cpu所花時間排序
fchela按返回數據所經歷的時間排序
fchdsk按返回數據時的物理讀操作的次數排序
fchqry按返回數據時一致模式讀取數據塊的次數排序
fchcu按返回數據時當前模式讀取數據塊的次數排序
fchrow按返回數據時處理的數據數量排序
注
這些排序中我經常用到的是fchdsk
Cpu時間和Elapsed時間都是以秒為單位
tkprof輸出文件各列的含義
parse:
將sql語句轉換成執行計劃
execute
oracle實際執行的語句
fetch
返回查詢獲得的行數
Count
這個語句被parse
Cpu
這個語句所有的parse
Elapsed
這個語句所有的parse
Disk
這個語句所有的parse
Query
在一致性讀的模式下
Current
在current模式下
Rows
語句返回的行數
我一般的思路步驟是
我自己建立了一個表
create table t
begin
for v
insert into t
end loop
commit;
end;
下面是sql_trace所抓到得sql
不正常狀態
*******************************************************************************
select *
from t
where id=
call count cpu elapsed disk query current rows
Parse
total
Misses in library cache during parse:
Optimizer goal: CHOOSE
Parsing user id:
Rows Row Source Operation
Rows Execution Plan
首先這是一個select語句
磁盤讀(
運行了
我只是選擇表的一行的數據的結果
正常狀態
在做跟蹤前我為這個表建立了一個索引
Create index t
*******************************************************************************
select *
from t
where id=
call count cpu elapsed disk query current rows
Parse
total
Misses in library cache during parse:
Optimizer goal: CHOOSE
Parsing user id:
Rows Row Source Operation
Rows Execution Plan
*******************************************************************************
同樣的語句
它走了索引
邏輯讀
同樣運行了
分析了
可以看出前後很大的差距
From:http://tw.wingwit.com/Article/program/Oracle/201311/17866.html