天天看點

Oracle中SQL語句執行效率問題的查找與解決

一、識别占用資源較多的語句的方法(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、幫忙分析是否需要索引或改善聯接

監控目前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會快些,需?/td>

  "FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或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)會自動選擇較小的表做外表。(優點:嵌套循環連接配接比其他連接配接方法有優勢,它可以快速地從結果集中提取第一批記錄,而不用等待整個結果集完全确定下來。缺點:如果内部行源表(讀取的第二張表(内表)已連接配接的列上不包含索引,或者索引不是高度可選時, 嵌套循環連接配接效率是很低的。如果驅動行源表(從驅動表中提取的記錄)非常龐大時,其他的連接配接方法可能更加有效。)