Oracle ——如何確定性能差的 SQL

http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/TSQ7/Default.aspx

本文主要說明在應用程序內書寫和調優 SQL 語句。假設,你已經知道你應用程序中的哪些 SQL 語句需要注意。事實上,這不太容易。那么,我們如何隔離性能差的 SQL?任何中等大小的應用程序都是由成千上萬行代碼組成,其中還包含 SQL。一個性能差的應用程序可能就毀在一個語句上。我們從哪里開始?

當涉及 SQL 時,性能不佳有兩方面:CPU 密集型語句(CPU-intensive statements)和 I/O 密集型語句(I/O-intensive statements)。

  • 前者很容易定位。所有的操作系統都可以讓我們查看 CPU 密集型任務。這些任務可以追溯到一個特定用戶,一個特定應用程序模塊。 CPU 密集型模塊一般都是由較差的代碼和/或結構造成,而不是性能差的 SQL。一旦確定模塊,你必須試圖使之更有效率。一個可能的解決方案是將把某些處理移除程序,讓數據庫處理(高明點的 SQL,存儲對象,內聯函數,數組處理等)。
  • 第二個是 I/O 密集型的 SQL 語句。這些語句會導致大量的數據庫 I/O(全表掃描,排序,更新等),并以很高代價運行幾個小時。從 Oracle 7 開始,解決了 SQL 識別問題。通過查詢數據庫共享池區域,我們可以很容易確定大多數 I/O 密集型 SQL 語句。

下面 SQL 語句演示了如何確定 I/O 命中率低于 80%的 SQL 語句。這個命中率是,自從 SQL 語句第一次被解析到共享池,通過所有執行的語句反應整體 I/O。下面可能是最近幾分鐘或幾天的結果:

sql> SELECT executions, 
   2        disk_reads, 
   3        buffer_gets,
   4        ROUND((buffer_gets - disk_reads) / buffer_gets, 2) hit_ratio,
   5        sql_text
   6     FROM   v$sqlarea
   7    WHERE  executions  > 0
   8     AND    buffer_gets > 0
   9     AND    (buffer_gets - disk_reads) / buffer_gets < 0.80
   10   order by 4 desc ;
?
EXECUTIONS DISK_READS BUFFER_GETS  HIT_RATIO SQL_TEXT
---------- ---------- ----------- ---------- -----------------------------------------------------------------------
        16        180         369        .51 SELECT SKU,PREPACK_IND,CASE_ID,TRANSFER_QTY,UNIT_COST,UNIT_RETAIL,ROWID
                                             FROM TSF_DETAIL WHERE transfer = :1  order by sku
        16        30          63         .52 SELECT TRANSFER,TO_STORE,TO_WH FROM TSFHEAD  WHERE TRANSFER = :b1  AND
                                             TRANSFER_STATUS = 'A'
        2         3           7          .57 SELECT SKU   FROM UPC_EAN  WHERE UPC = :b1
        12        14          35         .60 SELECT SUBSTR(DESC_UP,1,30),DEPT,SYSTEM_IND   FROM DESC_LOOK  WHERE
                                             SKU = :b1
        14        13          35         .63 SELECT UNIT_COST,UNIT_RETAIL,SUBCLASS FROM WIN_SKUS WHERE SKU = :b1

事實上,我們發現對特定的 SQL,上面的數據有些誤導,其實語句沒有問題。考慮下面 v$sqlarea 輸出:

Executions Disk_Reads Buffer_Gets Hit_Ratio Sql_Text
---------- ---------- ----------- --------- --------------------
    2          6          19         0.68   SELECT A.EMP_NO, ...

該語句的命中率很低,但事實上它很有效。因為,SQL 是通過 UNIQUE 索引操作的,物理磁盤讀取的數量幾乎與邏輯讀取一樣。UNIQUE 索引顯著減少了整體的物理和邏輯磁盤 I/O 數量,導致了一個令人誤解的低命中率。

下面例子,命中率很好。但是真的很好嗎?

Executions Disk_Reads Buffer_Gets Hit_Ratio Sql_Text
---------- ---------- ----------- --------- --------------------
    2         3625       178777      0.98   SELECT A.EMP_NO, ...

這個 SQL 語句看上去很有效。但是, 當我們仔細看時,事情就不是那么回事了。命中率并沒有透露出,該語句存在五個表連接,并且每次執行進行了超過 3600 個物理磁盤讀取。這是否太多了?是否有效?若不進一步研究,無法回答這兩個問題。事實上,這個實例中,五個表的中其一個錯誤地執行了全表掃描。通過重新構造 SQL,我們可以減少物理磁盤 I/O 到小于 50,同時,也顯著減少邏輯磁盤 I/O。巧合的是,命中率也下降到不到 70%。

我們首選 V$SQLAREA 查詢是每個語句執行的物理磁盤 I/O 的真實報告。命中率是信息性的,但有時會產生誤導。邏輯 I/O 相關的很少。如果語句執行 1,000,000 個邏輯 I/O,但只用了不到十分之一秒,這就沒人在乎了。這是總的物理 I/O,幾乎消耗了所有的時間,和確定潛在不正確的 SQL。例如:

sql> SELECT sql_text, executions,
             ROUND(disk_reads / executions, 2) reads_per_run,
             disk_reads, buffer_gets,
             ROUND((buffer_gets - disk_reads)
                  / buffer_gets, 2) hit_ratio,
             sql_text
      FROM   v$sqlarea
      WHERE  executions  > 0
      AND    buffer_gets > 0
      AND    (buffer_gets - disk_reads) / buffer_gets < 0.80
      ORDER by 3 desc ;

前兩個語句會報告更具啟發性的結果:

Executions Reads_Per_Run Disk_Reads Buffer_Gets Hit_Ratio Sql_Text
---------- ------------- ---------- ----------- --------- ------------
    2           3            6          19        0.68    SELECT ...
    2         1812.5       3625       178777      0.98    SELECT ...

從視圖 V$SQLAREA 中,我們可以立即隔離所有具有高物理讀取的語句。這些語句可能并不一定低效或寫得不好,但恰恰是它們需要進一步調查或調整。

o_r_%E7%BF%BB%E8%AF%91.jpg

轉載于:https://www.cnblogs.com/liuning8023/archive/2012/09/06/2674238.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379340.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379340.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#中的委托和事件(續)

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 歡迎瀏覽本文的后續文章&#xff1a; C#中的委托和事件(續)PDF 瀏覽&#xff1a;http://www.tracefact.net/Document/Delegates-and-Events-in-CSharp.pdf文中代碼在VS2005下通過&#xff0c;由于VS2003(.Ne…

Java LocalDate類| minusYears()方法與示例

LocalDate類minusYears()方法 (LocalDate Class minusYears() method) minusYears() method is available in java.time package. minusYears()方法在java.time包中可用。 minusYears() method is used to subtract the given years from this LocalDate and return the LocalD…

ffmpeg 命令添加圖片水印

使用ffplay預覽一下&#xff1a; ffplay -i cctvhttp.flv -vf “moviewatermark.png[watermark];[in][watermark]overlay x10:y10[out]” -x 640 -y 480 參數&#xff1a; 有兩個過濾器movie\overlay movie&#xff1a;讀取watermark.png輸出 [watermark]可以理解自定義的的變…

實驗9 SQL Server 的觸發器

實驗9 SQL Server 的觸發器一、實驗目的 1.了解觸發器的觸發過程和類型 2.通過執行SQL腳本&#xff0c;掌握創建觸發器并測試觸發器 3.掌握通過使用觸發器維護數據完整性的方法。 二、實驗要求 1.按指定要求創建觸發器。 三、實驗步驟 1.創建一個名為tr_age的觸發器&#xff0…

struts2學習筆記二--準備struts2的學習和開發環境

準備struts2的學習和開發環境1 導包2 參照開發包自帶的例子在web.xml文件中配置3 參照開發包自帶的例子編寫Action類和配置struts.xml文件<struts><package name"demo" namespace"/hello/word"><action name"test" class"cn…

C#實現動態桌面背景圖片切換

問題描述&#xff1a;凝視桌面背景&#xff0c;突感如果桌面背景是變化的像win7一樣&#xff0c;該多有意思啊。鬧鐘瞬間產生一個念頭&#xff0c;用C#寫一個動態切換桌面背景的圖片。如何實現這個想法了&#xff0c;我思考了一會兒&#xff0c;想到了如下的一些需要解決的問題…

duration java_Java Duration類| withSeconds()方法與示例

duration java持續時間類withSeconds()方法 (Duration Class withSeconds() method) withSeconds() method is available in java.time package. withSeconds()方法在java.time包中可用。 withSeconds() method is used to represent this Duration with the given seconds. wi…

ffmpeg 命令畫中畫效果

畫中畫效果也是和圖片水印一樣使用movie配合overlay實現 使用ffplay預覽一下&#xff1a; ffplay -i cctvhttp.flv -vf “moviecctvhttp.flv[subm];[in][subm]overlayx20:y30[o ut]” -x 640 -y 480 &#xff08;可以看到是有兩層視頻的&#xff09; 用個不同的視頻再測試&…

實驗10 SQL Server 數據備份/恢復

實驗10 SQL Server 數據備份/恢復一、實驗目的 1.了解數據庫備份的過程和屬性設置&#xff1b; 2.掌握應用企業管理器備份和恢復數據庫&#xff1b; 3.掌握應用T-SQL備份和恢復數據庫&#xff1b; 4.掌握數據導入/導出的方法。 二、實驗要求 1.創建指定數據庫的備份. 2.恢復數…

指針和數組

數組的概念與指針的概念聯系非常解密。其實數組的標識相當于它的第一個元素的地址&#xff0c;就像一個指針相當于它所指向的第一個元素的地址&#xff0c;因此其實它們是同一個東西 int numbers [20];int * p;下面的賦值為合法的&#xff1a; p numbers; 這里指針p 和numbers…

程序集(初嘗,也是為插件程序準備)

拓展名是EXE或者DLL的.net可執行程序稱為程序集。 .net程序集與一般的EXE&#xff0c;DLL的區別在于&#xff0c;它包含有metadata。 私有程序集 位于應用程序的目錄下。共享程序集 必須有一個特殊的版本號&#xff0c;唯一的名稱&#xff0c;通常安裝在全局程序集緩存&#xf…

Java BigInteger類| 帶示例的shiftLeft()方法

BigInteger類shiftLeft()方法 (BigInteger Class shiftLeft() method) shiftLeft() method is available in java.math package. shiftLeft()方法在java.math包中可用。 shiftLeft() method is used to shift the given number of bits towards the left side in this BigInteg…

匯編語言-011(無符號乘法指令MUL、有符號乘法指令IMUL、對比MUL乘法指令與SHL移位方式、符號位擴展指令,CBW,CWD,CDQ、DIV 無符號除法指令、IDIV 有符號除法指令)

1:無符號乘法指令MUL .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data val1 WORD 2000h val2 WORD 0100h .code main PROC;8位乘法mov al,5h ;被乘數mov bl,10hmul bl ;AX 0050h ,CF,OF 0;16位乘法mov ax,val1mul val2 ;DX:AX 002000…

編寫一個程序,實現將存放在AX和DX中的32位數據循環右移二進制數的4位。(DX存放高字節內容,AX存放低字節內容)

編寫一個程序&#xff0c;實現將存放在AX和DX中的32位數據循環右移二進制數的4位。&#xff08;DX存放高字節內容&#xff0c;AX存放低字節內容&#xff09; P151 例4.9 匯編思路&#xff1a; AX右移四位后&#xff0c;使用BH接收AL的低四位數據&#xff0c;得到BH的八位數據…

[轉 scrum] 大型項目開發使用敏捷是否合適?不該問的問題

原文地址&#xff1a;http://www.scrumcn.com/agiledev/html/?167.html轉載于:https://www.cnblogs.com/cly84920/archive/2010/03/17/4426844.html

匯編語言-012(擴展加法指令ADC、帶借位減法指令SBB、執行加法后進行ASCII調整指令、AAS 、AAM、AAD 、DAA指令將和數轉成壓縮十進制格式)

1:ADC : 擴展加法指令ADC .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCmov dl,0mov al,0FFhadd al,0FFh ;ALFEhadc dl,0 ;DL:AL 01FEhmov edx,0mov eax,0FFFFFFFFhadd eax,0FFFFFFFFh ;EAX FFFFFFFEhadc edx,0 …

c#中textbox屬性_C#.Net中的TextBox.Visible屬性與示例

c#中textbox屬性Here we are demonstrating use of Visible property of TextBox Control. 在這里&#xff0c;我們演示了TextBox Control的Visible屬性的使用。 Visible property contains two values 可見屬性包含兩個值 True: Using this - textbox can be visible on par…

VS2010報表

http://technet.microsoft.com/zh-cn/library/dd220516.aspx轉載于:https://www.cnblogs.com/mingyongcheng/archive/2012/09/11/2679722.html

思維的領域特殊性

思維的領域特殊性 1971年&#xff0c;心理學家Danny Kahneman和Amos Tversky做了這樣一個實驗&#xff0c;他們問統計學教授一些不像統計學的統計學問題&#xff0c;其中一個大概如下&#xff1a;假設你生活的城市有兩家醫院&#xff0c;一家大一家小&#xff0c;某一天&#x…

匯編語言-013(DAS 、DAA與DAS、QWORD類型用SBB借位減法、編寫指令將AX符號擴展到EAX,不能使用CWD、用SHR和條件判斷指令將AL循環右移一位、SHLD、壓縮十進制轉換)

1&#xff1a;DAS : SUB或SBB在AL中生成二進制結果&#xff0c;DAS&#xff08;減法后的十進制調整&#xff09;轉壓縮十進制格式 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC;計算85-48mov bl,48hmov al,85hsub al,bl ;AL3Dhd…