1、識別佔用資源較多的語句的方法(4種方法)
1.
測試組和最終用戶反饋的與反應緩慢有關的問題。
2.
利用V_$SQLAREA視圖提供了執行的細節。(執行、讀取磁盤和讀取緩衝區的次數)
•
數據列
EXECUTIONS
:執行次數
DISK_READS
:讀盤次數
COMMAND_TYPE
:命令類型(3:select,2:insert;6:update;7delete;47:pl/sql程序單元)
OPTIMIZER_MODE
:優化方式
SQL_TEXT
:Sql語句
SHARABLE_MEM
:佔用shared pool的內存多少
BUFFER_GETS
:讀取緩衝區的次數
•
用途
1
、幫忙找出性能較差的SQL語句
2
、幫忙找出最高頻率的SQL
3
、幫忙分析是否須要索引或改善聯接
3.
監控當前Oracle的session,如出現時鐘的標誌,表示此進程中的sql運行時間較長。
4.Trace
工具:
a)
查看數據庫服務的初始參數:timed_statistics、user_dump_dest和max_dump_file_size
b)
Step 1: alter session set sql_trace=true
c)Step 2: run sql
;
d)
Step 3: alter session set sql_trace=false
e)Step 4:
使用 「TKPROF」轉換跟蹤文件
f)Parse
,解析數量大一般代表須要增長數據庫服務器的共享池大小,
query
或current提取數量大代表若是沒有索引,語句可能會運行得更有效,
disk
提取數量代表索引有可能改進性能,
library cache
中多於一次的錯過代表須要一個更大的共享池大小
2、如何管理語句處理和選項
•
基於成本(Cost Based)和基於規則(Rule Based) 兩種優化器, 簡稱爲CBO 和RBO
•
Optimizer Mode
參數值:
Choose
:若是存在訪問過的任何表的統計數據 ,則使用基於成本的Optimizer,目標是得到最優的經過量。若是一些表沒有統計數據,則使用估計值。若是沒有可用的統計數據,則將使用基於規則的Optimizer
All_rows
:老是使用基於成本的Optimizer,目標是得到最優的經過量
First_rows_n
:老是使用基於成本的Optimizer,目標是對返回前N行(「n」能夠是1,10,100或者1000)得到最優的響應時間
First_rows
:用於向後兼容。使用成本與試探性方法的結合,以便快速傳遞前幾行
RULE
:老是使用基於規則的Optimizer
3、使用數據庫特性來得到有助於查看性能的處理統計信息(解釋計劃和AUTOTRACE)
No1: Explain Plan
A)
使用Explain工具須要建立Explain_plan表,這必須先進入相關應用表、視圖和索引的全部者的賬戶內. (@D:\oracle\ora92\rdbms\admin\utlxplan)
B)
表結構:
STATEMENT_ID
:爲一條指定的SQL語句肯定特定的執行計劃名稱。若是在EXPLAN PLAN語句中沒有使用SET STATEMENT_ID,那麼此值會被設爲NULL。
OPERATION:在計劃的某一步驟執行的操做名稱,例如:Filters,Index,Table,Marge Joins and Table等。
OPTION:對OPERATION操做的補充,例如:對一個表的操做,OPERATION多是TABLE ACCESS,但OPTION可能爲by ROWID或FULL。
Object_Owner:擁有此database Object的Schema名或Oracle賬戶名。
Object_name:Database Object名
Object_type:類型,例如:表、視圖、索引等等
ID:指明某一步驟在執行計劃中的位置。
PARENT_ID:指明從某一操做中取得信息的前一個操做。經過對與ID和PARENT_ID使用Connect By操做,咱們能夠查詢整個執行計劃樹。
C)
EXPLAIN
搜索路徑解釋
•
全表掃描(Full Table Scans)(
無可用索引,大量數據,小表 ,全表掃描hints,HWM(High Water Mark), Rowid掃描)
•
索引掃描
索引惟一掃描(Index Unique Scans)
索引範圍掃描(Index Range Scans)
索引降序範圍掃描(Index Range Scans Descending)
索引跳躍掃描(Index Skip Scans)
全索引掃描(Full Scans)
快速全索引掃描(Fast Full Index Scans)
索引鏈接(Index Joins)
位圖鏈接(Bitmap Joins)
•
如何選擇訪問路徑:
CBO
首先檢查WHERE子句中的條件以及FROM子句,肯定有哪些訪問路徑是可用的。而後CBO使用這個訪問路徑產生一組可能的執行計劃,再經過索引、表的統計信息評估每一個計劃的成本,最後優化器選擇成本最低的一個。
•
表的鏈接方式:
Nested Loops會循環外表(驅動表),逐個比對和內表的鏈接是否符合條件。在驅動表比較小,內表比較大,並且內外表的鏈接列有索引的時候比較好。當SORT_AREA空間不足的時候,Oracle也會選擇使用NL。基於Cost的Oracle優化器(CBO)會自動選擇較小的表作外表。(優勢:嵌套循環鏈接比其餘鏈接方法有優點,它能夠快速地從結果集中提取第一批記錄,而不用等待整個結果集徹底肯定下來。缺點:若是內部行源表(讀取的第二張表(內表)已鏈接的列上不包含索引,或者索引不是高度可選時, 嵌套循環鏈接效率是很低的。若是驅動行源表(從驅動表中提取的記錄)很是龐大時,其餘的鏈接方法可能更加有效。)
SORT-
merge JOIN
,
將兩表的鏈接列各自排序而後合併,只能用於鏈接列相等的狀況,適合兩表大小相若的狀況(在缺少數據的選擇性或者可用的索引時,或者兩個源表都過於龐大(超過記錄數的5%)時,排序合併鏈接將比嵌套循環連更加高效。可是,排列合併鏈接只能用於等價鏈接(WHERE D.deptno=E.dejptno,而不是WHERE D.deptno>=E.deptno)。排列合併鏈接須要臨時的內存塊,以用於排序(若是SORT_AREA_SIZE設置得過小的話)。這將致使在臨時表空間佔用更多的內存和磁盤I/O。)
HASH JOIN
在其中一表的鏈接列上做散列,所以只有另一個表作排序合併,理論上比SORT JOIN會快些,須要有足夠的內存,並且打開了SORT_JOIN_ENABLE參數。(
當缺乏有用的索引時,哈希鏈接比嵌套循環鏈接更加有效。哈希鏈接可能比排序合併鏈接更快,由於在這種狀況下只有一張源表須要排序。哈希鏈接也可能比嵌套循環鏈接更快,由於處理內存中的哈希表比檢索B_樹索引更加迅速。和排序合併鏈接、羣集鏈接同樣,哈希鏈接只能用於等價鏈接。和排序合併鏈接同樣,哈希鏈接使用內存資源,而且當用於排序內存不足時,會增長臨時表空間的I/O(這將使這種鏈接方法速度變得極慢)。最後,只有基於代價的優化器纔可使用哈希鏈接。
)
索引鏈接:
No2: AUTOTRACE
•
set autotrace
使用步驟:
1
、以system登陸
2
、建立plustrace角色; <your_oracle_home>\sqlplus\admin\plustrce.sql
3
、向常規用戶授予權限:grant plustrace to <user id>
4
、若是沒有plan_table也要建立: <your_oracle_home>\rdbms\admin\utlxplan.sql
•
set autotrace
選項
on
|
顯示查詢結果,執行計劃,統計數據
|
on statistics
|
顯示查詢結果,統計數據,不顯示執行計劃
|
on explain
|
顯示查詢結果,執行計劃,不顯示統計數據
|
traceonly
|
顯示執行計劃和統計結果,但不包括查詢結果
|
traceonly statistics
|
僅顯示統計數據
|
recursive calls
|
在用戶級別和系統級別上生成的遞歸調用的數量。Oracle維護了一些用於內部處理的表。當oracle須要對這些表進行更改時,它就會在內部生成一個SQL語句,而後這個語句再生成一個遞歸調用。
|
db block gets
|
請求一個CURRENT塊的次數
|
consistent gets
|
爲一塊請求consistent read的次數
|
physical reads
|
從磁盤讀取得數據塊總數。這個數量等於「直接物理讀取」的值加上讀入緩衝區的全部數據塊
|
redo size
|
生成的重作的總數量(以字節爲單位)
|
bytes sent via SQL * Net to client
|
從前臺進程發送給客戶的總字節數
|
bytes received via SQL * Net from client
|
經過Oracle Net從客戶接收的總字節數
|
SQL*Net roundtrips to/from client
|
發送給客戶和從客戶接收的Oracle Net消息的總數
|
sorts (memory)
|
徹底在內存中執行而且不須要任何磁盤寫入的排序操做的數量
|
sorts (disk)
|
至少須要一個磁盤寫入的排序操做的數量
|
rows processed
|
在操做過程當中處理的行數
|
4、最後,使用計時特性來測量和比較處理時間
Set timing onsql