Oracle的SQL語句執行效率問題查詢與解決方法

2021-12-30 01:02:10 字數 4908 閱讀 4039

一、識別占用資源較多的語句的方法(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語句進行語法和詞法分析。名詞解釋 ...