一、識別占用資源較多的語句的方法(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中多於一次的錯過表明需要乙個更大的共享池大小
二、如何管理語句處理和選項
• 基於成本(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
三、使用資料庫特性來獲得有助於檢視效能的處理統計資訊(解釋計畫和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角色; \sqlplus\admin\plustrce.sql
3、向常規使用者授予許可權:grant plustrace to
4、如果沒有plan_table也要建立: \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
在操作過程中處理的行數
四、最後,使用計時特性來測量和比較處理時間
set timing on
作者「erdp技術架構」
sql語句or與union all的執行效率比較
看到一篇文章是講sql語句or與union all的執行效率比較的,以前沒怎麼注意這個問題,感覺文章寫的不錯,轉來一看。sql語句or與union all的執行效率比較 當sql語句有多個or語句時,可以考慮使用union或者union all代替來提高速度。使用or的sql語句往往無法進行優化,導...
Oracle的sql語句執行過程
sql語句的執行過程 1.連線方式 2.查詢語句的執行過程 1 語句解析 a 檢查庫快取,有無執行過相同的sql語句 沒有,進入b 有,進入2 b 檢查語法 關鍵字 c 檢查語義 表名,列名 d 獲得解析鎖 e 核對訪問許可權 f 確定執行計畫 explain plan g 儲存執行計畫到快取區 2...
Oracle執行SQL語句的過程
當我們提交一條sql語句時,oracle會做哪些操作呢?oracle會為每個使用者程序分配乙個伺服器程序 service process 實際情況應該區分專用伺服器和共享伺服器 當service process接收到使用者程序提交的sql語句時,伺服器程序會對sql語句進行語法和詞法分析。名詞解釋 ...