本次我們主要講解oracle 10053事件和實驗,好多朋友可能對這個事件不是很熟悉,因為在日常營運中用到的不是很多。Oracle 10046和10053都是非官方trace sql的方法,在官方文檔上是找不到相關資料的,但在MOS上可以找到。sql_trace是官方推薦的trace sql的方法,在官方文檔上是可以查詢出來的。
10053事件:用來描述oracle如何選擇執行計畫的過程,然後輸出到trace檔案裡,共我們參考,因為我們經常看執行計畫怎麼執行的消耗了哪些資源,而不是常看執行計畫怎麼選擇出來了的。
10053情境:當SQL語句執行時走的是錯誤的執行計畫,而又找不到原因時,這時請用10053來分析一下原因。
10053特點:
(1)只可以瞭解oracle執行計畫的選擇過程
(2)無法獲知代價的計算公式,因為這是oracle內部的商業機密,而且每個oracle版本的最佳化器計算公式都不相同差距還是蠻大的,不同版本的同一個語句的代價也不一樣,最佳化器現在還不是很成熟,還有待完善。
(3)在這個裡面我們重點要瞭解的是“代價”是如何計算出來的,然後我們才能瞭解執行計畫是如何選擇的。
(4)在10053中可以瞭解哪些因素影響sql的執行代價
(5)oracle 8i cost等價IO資源消耗 9i以後cost等價IO+CPU+網路+等待事件+其他代價
一般IO資源的權重比較大CPU權重較小
10053內容:
參數區:初始化參數,隱含參數,這些參數可以左右oracle工作方式
SQL區:執行的SQL語句,是否使用綁定變數,是否進行了轉換操作
系統資訊區:作業系統統計資訊 cpu主頻CPU執行時間IO定址時間單塊讀時間多塊讀時間
對象統計資訊區:
資料訪問方式:訪問方式不一樣計算代價的方法也不一樣,全表掃描走索引多表關聯代價都不同
關聯查詢:把每張表都作為驅動表去組合,擇優選擇“代價”最小的關聯方式,與哪個表在前無關係
代價的最後修正:oracle會對選擇出來的代價再進行最後的修正,使其更準確一些,更合理一些
選擇出最終執行計畫:這個過程是非常快速的,毫秒級就搞定啦
實驗環境
LEO1@LEO1> select * from v$version; 這是我的oracle edition
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
1.驗證全表掃描的成本計算公式,貼出執行計畫和計算公式。
LEO1@LEO1> col sname for a20
LEO1@LEO1> col pname for a20
LEO1@LEO1> col pual1 for a30
LEO1@LEO1> col pual2 for a30
LEO1@LEO1> select * from sys.aux_stats$; 查看作業系統統計資訊
SNAME PNAME PVAL1 PVAL2
本欄目更多精彩內容:http://www.bianceng.cn/database/Oracle/
-------------------- -------------------- ---------- ---------------------------------------------------
SYSSTATS_INFO STATUS COMPLETED
SYSSTATS_INFO DSTART 08-15-2009 00:49
SYSSTATS_INFO DSTOP 08-15-2009 00:49
SYSSTATS_INFO FLAGS 1
SYSSTATS_MAIN CPUSPEEDNW 2657.0122
SYSSTATS_MAIN IOSEEKTIM 10
SYSSTATS_MAIN IOTFRSPEED 4096
SYSSTATS_MAIN SREADTIM
SYSSTATS_MAIN MREADTIM
SYSSTATS_MAIN CPUSPEED
SYSSTATS_MAIN MBRC
SYSSTATS_MAIN MAXTHR
SYSSTATS_MAIN SLAVETHR