国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

游標腳本性能問題詳解之案例實踐篇

數據庫 SQL Server 數據庫運維
關系數據庫中的操作會對整個行集起作用。由 SELECT 語句返回的行集包括滿足該語句的 WHERE 子句中條件的所有行。這種由語句返回的完整行集稱為結果集。應用程序并不總能將整個結果集作為一個單元來有效地處理。這些應用程序需要一種機制以便每次處理一行或一小部分行。游標不僅可提供這種機制,而且是對結果集的一種擴展。

游標類型對性能影響的實例。下面的兩個游標腳本分別創建并執行了dynamic和fast forward only兩種類型的游標。

知識補充:

關系數據庫中的操作會對整個行集起作用。由 SELECT 語句返回的行集包括滿足該語句的 WHERE 子句中條件的所有行。這種由語句返回的完整行集稱為結果集。應用程序并不總能將整個結果集作為一個單元來有效地處理。這些應用程序需要一種機制以便每次處理一行或一小部分行。游標不僅可提供這種機制,而且是對結果集的一種擴展。

游標通過執行以下操作來擴展結果集處理:

  1. 允許定位在結果集的特定行。
  2. 從結果集的當前位置檢索一行或一部分行。
  3. 支持對結果集中當前位置的行進行數據修改。
  4. 為由其他用戶對顯示在結果集中的數據庫數據所做的更改提供不同級別的可見性支持。

不理想的游標類型:(dynamic游標)

  1. declare @p1 int  set @p1=NULL    
  2. declare @p2 int  set @p2=0    
  3. declare @p5 int  set @p5=4098  
  4. declare @p6 int  set @p6=8193    
  5. declare @p7 int  set @p7=0    
  6.  
  7. exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(30),@P2 varchar(15)',  
  8. N'  
  9. SELECT       T1.CONFLICT_ID  
  10. FROM         dbo.S_AUDIT_ITEM T1              
  11. LEFT OUTER JOIN dbo.S_USER T2   
  12. ON T1.USER_ID = T2.PAR_ROW_ID      
  13. WHERE  ((T1.BC_BASE_TBL = @P1)    
  14. AND  (T1.RECORD_ID = @P2))      
  15. ORDER BY  T1.OPERATION_DT DESC    
  16. OPTION (FAST 40)  
  17. ',  
  18. @p5 output,@p6 output,@p7 output,'1-10350J','S_PARTY'    
  19.  
  20. print 'fetch' 
  21. exec sp_cursorfetch @p2,2,4,1    
  22.  
  23. exec sp_cursorclose @p2 

理想的游標類型(fast forward only游標)

  1. declare @p1 int  set @p1=NULL    
  2. declare @p2 int  set @p2=0    
  3. declare @p5 int  set @p5=4112  
  4. declare @p6 int  set @p6=8193    
  5. declare @p7 int  set @p7=0    
  6.  
  7. exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(30),@P2 varchar(15)',  
  8. N'  
  9. SELECT       T1.CONFLICT_ID  
  10. FROM         dbo.S_AUDIT_ITEM T1              
  11. LEFT OUTER JOIN dbo.S_USER T2   
  12. ON T1.USER_ID = T2.PAR_ROW_ID      
  13. WHERE  ((T1.BC_BASE_TBL = @P1)    
  14. AND  (T1.RECORD_ID = @P2))      
  15. ORDER BY  T1.OPERATION_DT DESC    
  16. OPTION (FAST 40)  
  17. ',  
  18. @p5 output,@p6 output,@p7 output,'S_SRV_REQ','1-WUQTM6'    
  19.  
  20. select @p1, @p2, @p5, @p6, @p7  
  21.  
  22. print '2' 
  23. exec sp_cursorfetch @p2,2,1,1    
  24. print '3' 
  25. exec sp_cursorclose @p2 

注:腳本中用到的和游標有關的存儲過程,請參考:http://jtds.sourceforge.net/apiCursors.html#_sp_cursorprepexec

一、如何解讀游標的類型

  1. sp_cursorprepexec [@handle =] statement_handle OUTPUT,  
  2.      [@cursor =] cursor_handle OUTPUT,  
  3.      [@paramdef =] N'parameter_name data_type, [,...n]'   
  4.      [@stmt =] N'stmt',  
  5.      [, [@scrollopt =] scroll_options OUTPUT]  
  6.      [, [@ccopt =] concurrency_options OUTPUT]  
  7.      [, [@rowcount =] rowcount OUTPUT]  
  8.  
  9. @scrollopt  

 

[@ccopt

 

@p5=4098 轉成16進制就是1002,對應的游標類型為Parameterized query + Dynamic cursor

@p5=4112 轉成16進制就是1010,對應的游標類型為Parameterized query + Fast forward-only cursor

問題的現象是,左邊的游標類型下,該腳本執行時間遠大于右邊的游標類型。

#p#

二、如何比較兩個不同執行計劃的優劣

在繼續以下內容之前,這里要介紹一些查看和比較語句執行計劃的知識。通常情況下,我們從management studio中輸出圖形界面的執行計劃進行直觀的比較,查看每個表用的訪問方式,使用index還是table scan,使用了哪個index,表和表之間使用的join 方式有什么不一樣。但是如果是一個復雜的語句,在不同的數據庫上使用了不同的執行計劃,對于同樣表的訪問,使用了不同的index,如何比較哪種執行計劃更加優化呢?比較整個語句的執行時間是一種方法,但是這個比較的結果并不準確。語句的執行時間很容易受到其他外在因素的影響:

1. 不同機器上CPU,memory和disk的性能會影響執行時間。

2. 測試的時候有沒有其他人在使用同樣的數據造成阻塞

3. 其他人堆數據庫的使用占用了系統資源

以上這些原因都有可能影響的語句的執行時間,從而影響到我們對語句性能結果的比較。因此我們不能把語句的執行時間作為衡量語句性能的標準。

這里介紹一種比較語句cost的方法。我們對于語句cost的衡量,主要是通過比對語句總的logical reads.

我們可以通過在management studio里的query window 執行”set statistics io on” ,在當前窗口中對所有執行的語句輸出信息:

  1. set statistics io on 
  2. select * from dbo.test_TicketFact  
  3. set statistics io on 

執行語句兩次,以消除physical reads和read-ahead reads的影響。

輸出的結果如下:

  1. (320 row(s) affected)  
  2. Table 'test_TicketFact'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.  

這里打印出來了語句中訪問過的table的訪問次數,總共的logical reads,physical reads等信息

這里我們需要關注的是logic reads的值,這個值實際上決定了對于IO和DISK以及內存的消耗。當語句是第一次執行,我們會看到physical reads的數字,以,而當語句第二次執行的時候,這些數據已經被讀到memory里面了,因此我們會看到physical read和read-ahead reads都變為0,而logical reads的值就變成了語句所有使用的data的量。

為什么logic reads是我們需要關注的值呢?因為logic reads決定了語句要訪問數據的量。如果我們的系統瓶頸在IO上,一旦語句需要訪問的數據從內存里面清除,這個語句原本所有的logic reads會全部轉為physical reads.因此那些大量使用logic reads就是可能導致大量physical reads的元兇。如果我們的bottleneck是CPU,這些做大量logical reads的語句同樣有可能導致大量的memory 讀,而讀memory是需要消耗CPU資源的。因此,無論是CPU,memory還是DISK的瓶頸,那些做大量logical reads的語句都非??赡苁窃斐蓡栴}的原因。

由以上內容,我們可以得出結論,語句的性能好壞,取決與這個語句做了多少logical reads.因此,如果同樣的語句,使用了不同的執行計劃,那么總的logical reads低的那個執行計劃就是相對優化的。

#p#

三、分析本案例中兩種游標的執行計劃

現在我們回到需要研究的腳本,在這里,語句是一樣的,不同的只是游標的類型。不同的執行時間說明很可能這個語句使用了不同的執行計劃。現在問題變成了,同樣語句使用了不同的執行計劃,得到了不同的執行時間。我們首先從”set statistics io on” 的結果入手:

1.左邊使用dynamic游標有大量的邏輯讀,情況如下:

  1. Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.  
  2. Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.  
  3. Table 'S_AUDIT_ITEM'. Scan count 1, logical reads 9770695, physical reads 0, read-ahead reads 1, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.  

2.而右邊使用fast forward only游標只有三次邏輯讀,情況為:

  1. Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.  
  2. Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.  
  3. Table 'S_AUDIT_ITEM'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

從這里輸出的結果的區別,說明了在table S_AUDIT_ITEM上SQL Server使用了不同的訪問方式

接下來我們分析兩個腳本的執行計劃:

1. dynamic游標對應的不理想的執行計劃中,SQL Server選擇了索引掃描(index scan)及索引S_AUDIT_ITEM_M4來查閱S_AUDIT_ITEM表。因此我們會在這里看到大量的IO。

 

這個索引掃描實際上訪問了整張表的數據。

2.而fast forward only游標對應的理想的執行計劃中,SQL Server選擇的是索引查找(index seek)及索引S_AUDIT_ITEM_M3來查閱S_AUDIT_ITEM表。所以我們只看到3個邏輯讀。索引S_AUDIT_ITEM_M3包含4個列,第一個列是RECORD_ID。另外,在語句中,有WHERE條件T1.RECORD_ID=@P2

 

#p#

四、嘗試解決問題

首先我們嘗試更新統計信息:UPDATE STATISTICS ON S_AUDIT_ITEM WITH FULLSCAN,但是這個操作在此問題案例中沒有作用。

從以上的分析中,我們已經發現,如果使用index S_AUDIT_ITEM_M3訪問S_AUDIT_ITEM表,得到的執行計劃非常好,我們可以直接用index hint來解決這個問題:

  1. declare @p1 int set @p1=NULL 
  2.  
  3.   declare @p2 int set @p2=0  
  4.  
  5.   declare @p5 int set @p5=4098  
  6.  
  7.   declare @p6 int set @p6=8193  
  8.  
  9.   declare @p7 int set @p7=0  
  10.  
  11.   exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(30),@P2 varchar(15)',  
  12.  
  13.   N'  
  14.  
  15.   SELECT T1.CONFLICT_ID  
  16.  
  17.   FROM dbo.S_AUDIT_ITEM T1 with (INDEX=S_AUDIT_ITEM_M3) /* 解決方案2 */  
  18.  
  19.   LEFT OUTER JOIN dbo.S_USER T2  
  20.  
  21.   ON T1.USER_ID = T2.PAR_ROW_ID  
  22.  
  23.   WHERE ((T1.BC_BASE_TBL = @P1)  
  24.  
  25.   AND (T1.RECORD_ID = @P2))  
  26.  
  27.   ORDER BY T1.OPERATION_DT DESC 
  28.  
  29.   OPTION (FAST 40)  
  30.  
  31.   ',  
  32.  
  33.   @p5 output,@p6 output,@p7 output,'1-10350J','S_PARTY' 
  34.  
  35.   print 'fetch' 
  36.  
  37.   exec sp_cursorfetch @p2,2,4,1  
  38.  
  39.   exec sp_cursorclose @p2  
  40.  

 

責任編輯:艾婧 來源: ITPUB
相關推薦

2011-04-06 09:30:29

游標腳本性能問題

2011-04-07 11:02:52

游標

2010-05-26 18:08:30

Linux性能監控

2025-12-12 09:44:23

2015-09-16 14:37:50

Android性能優化運算

2015-09-16 15:48:55

Android性能優化電量

2015-09-16 13:54:30

Android性能優化渲染

2012-09-10 09:39:31

Hadoop成功部署案例eBay

2011-03-02 11:25:10

vsftpd配置

2023-07-10 16:18:18

性能優化開發

2010-02-07 13:55:12

萬兆交換機

2010-05-26 18:40:54

Linux性能監控

2011-11-08 21:47:37

Linux 監控 IO

2011-04-18 10:16:30

WEB高性能

2010-05-26 18:21:04

Linux性能監控

2010-05-26 18:31:51

Linux性能監控

2018-09-03 09:22:25

監控服務器性能

2020-03-17 09:21:20

MariaDBSpider存儲

2012-06-15 10:13:03

2011-07-22 09:50:34

云服務云計算
點贊
收藏

51CTO技術棧公眾號

欧美久久久久久久久中文字幕| 亚洲国产精久久久久久 | 水蜜桃色314在线观看| 少妇视频一区| 超碰在线资源| 久久国产夜色精品鲁鲁99| 亚洲最大的免费视频网站| 国产丝袜在线精品| 国产精品成人在线| 青娱在线视频| 99综合精品| 亚洲美女又黄又爽在线观看| 欧美一级视频在线播放| 欧美电影院免费观看| 中文字幕中文字幕在线一区 | 国产成人综合自拍| 久久精品中文字幕免费mv| 国产精品久久久毛片| 日韩系列欧美系列| 欧美一区二区人人喊爽| 亚洲精品一区国产精品| 国产精品迅雷| 亚洲欧美一区二区三区久本道91| 成人高清视频观看www| caopo在线| 99久久伊人网影院| 国产精品丝袜高跟| 国产精品刘玥久久一区| 日韩一区二区在线免费观看| 国产h视频在线播放| 教室别恋欧美无删减版| 在线电影欧美成精品| 欧美三级黄网| 91蝌蚪porny| 亚洲一区亚洲二区| 日韩精品99| 天天操天天干天天综合网| 国产精品区一区| 亚洲精品一区av| 国模精品一区二区三区色天香| 岛国成人毛片| 精品视频在线观看日韩| 一级香蕉视频在线观看| 国产精品一区二区三区四区| 国产精品偷伦一区二区| 亚洲最新色图| 久久99久久99精品中文字幕| 大胆av不用播放器在线播放| 99视频在线精品| 香港日本韩国三级网站| 亚洲国产一区二区在线观看| 亚洲网站在线播放| 亚洲高清国产精品| www.欧美精品一二区| 色噜噜狠狠永久免费| 日本高清无吗v一区| 日韩无套无码精品| 日韩高清不卡一区二区| 欧美与欧洲交xxxx免费观看| 激情开心成人网| 97精品国产97久久久久久| 999av小视频在线| 亚洲成人动漫精品| 少妇人妻互换不带套| 日本最新不卡在线| 国产精品美女在线观看| 成人啊v在线| 日韩欧中文字幕| the porn av| 91久久国产综合久久| 三级成人在线| 亚洲最大福利视频网| 婷婷综合一区| 国产午夜精品理论片a级探花| 国产精品**亚洲精品| 亚洲成av人片在线观看香蕉| 欧美大片91| 欧美在线3区| 欧美在线资源| 高清视频欧美一级| 亚洲精品黄色| 亚洲伊人久久大香线蕉av| 精品一区二区日韩| 波多野结衣三级在线| 欧美日韩国产免费观看| 日韩免费不卡av| 久久在线观看| 精品国产乱码久久久久久88av| 亚洲一区二区免费在线观看| 欧美亚洲综合一区| 国语精品免费视频| 亚洲国产精品二十页| 六月丁香婷婷激情| 国产在线一区二区综合免费视频| 国产伦精品一区二区| 国产精品人妖ts系列视频| 日本网站免费在线观看| 欧美片网站yy| 久久理论电影| 国产日韩综合一区二区性色av| 中文一区二区三区四区| 精品一卡二卡三卡四卡日本乱码| 亚洲欧美色一区| 六九午夜精品视频| 久久夜色精品国产| 亚洲福利影视| 在线成人免费网站| 日韩黄色碟片| 亚洲日本一区二区三区在线不卡| 日韩电影免费在线看| 中文字幕在线免费观看| 欧美成人免费播放| 99精品美女视频在线观看热舞| 国产专区一区二区| 奇米一区二区三区| 尤物在线视频| 精品嫩草影院久久| 91精品xxx在线观看| 亚洲精品视频一区二区三区| 欧美性jizz18性欧美| 每日更新在线观看av| 欧日韩精品视频| 麻豆影院在线| 91精品中文在线| 在线一区免费观看| 精品99又大又爽又硬少妇毛片| 欧美日韩国产精选| 97天天综合网| 欧美一区二区三区在线播放| 在线看不卡av| 欧美久久一区| 免费观看成年在线视频网站| 成人福利在线观看| 日韩欧美999| 欧美成人首页| 麻豆视频网站在线观看| 欧美久久在线| 成人av免费观看| 伊人精彩视频| 91精品欧美一区二区三区综合在 | 99视频这里有精品| 色综合av综合无码综合网站| 成人欧美一区二区三区小说 | 性国裸体高清亚洲| 久久久精品影院| 国产91色综合久久免费分享| 污版视频在线观看| 欧美一级淫片播放口| 亚洲国产精品久久人人爱蜜臀| 91精品国产成人观看| 福利在线观看| 精品国偷自产在线| 国产精品乱人伦中文| 俺要去色综合狠狠| 成人在线观看毛片| 亚洲色图20p| 国产伦一区二区三区| 先锋在线资源一区二区三区| 国产精品色在线观看| 深夜福利久久| 青春草在线视频免费观看| 国产亚洲一区精品| 欧美国产精品中文字幕| 亚洲福利天堂| 国产三级中文字幕| 天天亚洲美女在线视频| 亚洲黄色免费| 国产亚洲精彩久久| 男人天堂v视频| 亚洲视频第一页| 中文字幕一区二区三区久久网站| av色图一区| 欧洲成人免费视频| 久久99最新地址| 青青草在线播放| 中文字幕国内精品| 欧美日本在线| 在线看片福利| 久草在.com| 北条麻妃99精品青青久久| 亚洲午夜一区| 国产视频青青| 久久一区二区精品| 性感美女久久精品| 中文无码日韩欧| 毛片免费在线播放| 九一免费在线观看| 国产精品日韩专区| 亚洲毛片在线免费观看| 亚洲国产精品麻豆| 成人av动漫在线| 欧美精品色网| 精品欧美视频| 成年人网站在线| 自拍偷拍一区二区三区四区| 先锋影音日韩| av日韩中文字幕| 欧美性猛交xxxx免费看| 成人久久久精品乱码一区二区三区| 欧美xxx黑人xxx水蜜桃|