亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?

2024-07-21 02:48:44
字體:
來源:轉載
供稿:網友
Stored PRocedure 里的 WITH RECOMPILE 到底是干麻的?

在 SQL Server 創建或修改「存儲過程(stored procedure)」時,可加上 WITH RECOMPILE 選項,但多數文檔或書籍都寫得語焉不詳,或只解釋為「每次執行此存儲過程時,都要重新編譯」。事實上,是指執行此一存儲過程時,要強制重新產生「執行計劃(execution plan)」,而不要從「緩存(cache)」去取得舊的「執行計劃」。

SQL Server 在評估與產生「執行計劃」時,非常耗 CPU 資源,因此,如何讓其正確地從 cache 中,重復使用舊的「執行計劃」就很重要;但是,若誤用舊的「執行計劃」,導致 SELECT 查詢的性能大幅下降,則更得不償失。

一般的 SQL 查詢,兩次或多次執行的 SQL 語句中,內容必須完全符合,才能延用舊的「執行計劃」,包含: 大小寫、換行、空白。如下圖 1,因為兩次執行的 SQL 語句,差了一個「半形空格」,導致產生了兩次「執行計劃」,而無法重復使用舊的「執行計劃」。

圖 1 浪費資源產生了兩次「執行計劃」

1 DBCC FREEPROCCACHE2 3 SELECT * FROM Customers SELECT * FROM Orders4 GO5 SELECT * FROM Customers  SELECT * FROM Orders6 7 SELECT cacheobjtype, objtype, usecounts, sql FROM sys.syscacheobjects 8 WHERE sql NOT LIKE '%cache%' AND sql NOT LIKE '%sys.%'
View Code

若是改用「參數化查詢」,如下 : SELECT * FROM Customers WHERE CustomerID=@CustomerID 即可避免因參數值不同,一直產生新的「執行計劃」,亦可避免 SQL Injection 攻擊。

而存儲過程,相對于一般 SQL 語句,其在性能上的優勢,除了已事先編譯外,存儲過程也可提升「執行計劃」的重用性(復用性),避免產生新的「執行計劃」、消耗 CPU 資源。如下圖 2,兩次調用同一個存儲過程時,但傳入不同的參數,SQL Server 會重復使用同一個「執行計劃」,如同上述的「參數化查詢」一樣,不會浪費資源產生新的「執行計劃」。

圖 2 「執行計劃」被重復使用,避免浪費資源

 1 CREATE PROC spCust1 @CustID NVARCHAR(5) 2 AS 3 SELECT * FROM dbo.Customers  4 WHERE CustomerID=@CustID 5 GO 6  7 EXEC spCust1 'ALFKI' 8 EXEC spCust1 'BERGS' 9 10 --DBCC FREEPROCCACHE11 SELECT cacheobjtype, objtype, usecounts, sql FROM sys.syscacheobjects 12 WHERE sql NOT LIKE '%cache%' AND sql NOT LIKE '%sys.%'
View Code

但若存儲過程「數據內容分布不平均」,例如某個 Table,里面有個 Int 類型的字段,大量記錄里所存儲的值依序為 1~100,但只有某一條記錄存的是 10000。亦即符合過濾條件的記錄有時極多 (「執行計劃」適合用「索引掃描」),但有時符合的只有一兩條 (「執行計劃」適合用「索引查找」)。而未來在調用此存儲過程時,兩種情境都有可能出現,因此我們希望此一存儲過程,在執行時「不要 cache 執行計劃」,亦即讓此存儲過程在每次執行時,都重新評估、產生最適當的「執行計劃」,此時就可加上 WITH RECOMPILE 選項?;蛘呷缦聢D 3,丟給前端應用程序去決定,亦即 AP 在調用此存儲過程時,再決定是否加上 WITH RECOMPILE 參數。

圖 3

1 Exec select_Proc1 @Key1=5       --自動選用高效能的「執行計畫」2 Exec select_Proc1 @Key1=10000   --從 cache 延用舊的「執行計畫」,因不適用,反而導致效能不佳3 Exec select_Proc1 @Key1=10000 WITH RECOMPILE --強制重新產生新的、高效能「執行計畫」
View Code

還有其他進階的選項應用,像是可以在創建存儲過程時,使用 OPTIMIZE FOR 選項,只針對特定某一個參數值來做 cache,來產生固定一種、平均對性能影響最小的「執行計劃」,又能避免一直重復產生新的「執行計劃」而浪費 CPU 資源。


案例分析 - 同樣的語法在存儲過程內跑很慢,單獨跑很快 (胡百敬, 繁體中文) : http://byronhu.Wordpress.com/2010/07/15/with-recompile/

引用該文部分內容 :

朋友問了一個有趣的問題:同樣的語句,在存儲過程內跑很慢,單獨跑很快。

存儲過程會緩存執行計劃 (若未加上 WITH RECOMPILE),一般來說可以省掉 CPU 耗費。但若兩次執行此存儲過程的期間,所引用的記錄數量差異很大,則第二次執行時沿用舊的執行計劃,性能會變得很差??梢杂^察以下現象:

  1. 觀察執行后的執行計劃,傳回大量記錄卻是用「索引查找」。
  2. 透過 Profiler 觀察存儲過程內的語法,和單獨執行的語法,所耗的 IO/CPU/Duration 的數值。若將某句的語法單獨拿到 Management Studio 執行的性能,遠好于該句語法在存儲過程內執行,就有可能是上述原因。

簡單的解法,是在執行或創建存儲過程時,搭配 WITH RECOMPILE 選項。

...中間略...

存儲過程的執行情境可以分 80-20 定律,若少數執行狀況 AP 自己知道,則 AP 可以判讀是否要下 with recompile 或是撰寫存儲過程直接搭配 Option(Optimize for (參數定義))

但在一些狀況,例如使用者下 Range 查詢,或是「財務滾算」數據,會大量刪除、插入中繼表內的數據,developer 無法預先評估可能的數據量大小,則在存儲過程創建時,直接搭配 with recompile,可得到較穩定的執行性能。


結語: 我自己早年寫 AP 時,一直查不到 WITH RECOMPILE 是干麻的,當時我寫用來「分頁(換頁)」的存儲過程時 (雙 TOP 夾擊、或 ROW_NUMBER 函數),就一律加上 WITH RECOMPILE 選項?,F在回想起來,其實是不必加的,因為重復用舊的「執行計劃」即可 (可節省許多數據庫伺服器上的資源),丟入的參數也都差不多 (用戶目前所在頁數、每頁要傳回幾條記錄)。

 1 CREATE PROCEDURE [dbo].[GridView_pager] 2 @StartRowIndex    int, 3 @PageSize int, 4 @tableName nvarchar(50), 5 @columnName nvarchar(100), 6 @sqlWhere nvarchar(1000), 7 @groupBy nvarchar(100), 8 @orderBy nvarchar(100), 9 @rowCount int output10 WITH RECOMPILE11 AS
View Code

相關文章:

談一談 SQL Server 中的執行計劃緩存http://www.cnblogs.com/CareySon/archive/2013/05/04/3058592.htmlhttp://www.cnblogs.com/CareySon/archive/2013/05/04/PlanCacheInSQLServerPart2.html



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91高清视频在线免费观看| 96精品久久久久中文字幕| 亚洲aa在线观看| 欧美成人剧情片在线观看| 91中文字幕在线| 久久久亚洲福利精品午夜| 欧美最近摘花xxxx摘花| 国产91在线播放精品91| 亚洲欧美在线播放| 国产精品久久久久久久天堂| 欧美大片免费观看在线观看网站推荐| 日韩精品在线观看网站| 久久777国产线看观看精品| 中文国产成人精品| 欧美性受xxxx白人性爽| 免费91麻豆精品国产自产在线观看| 久久久视频在线| 色噜噜狠狠狠综合曰曰曰88av| 亚洲老头同性xxxxx| 亚洲女性裸体视频| 久久久久久伊人| 这里只有精品视频| 成人免费淫片视频软件| 黑人巨大精品欧美一区二区免费| 国产69精品久久久| 久久视频免费在线播放| 亚洲国产女人aaa毛片在线| 色噜噜狠狠狠综合曰曰曰| 亚洲午夜av久久乱码| 国产精品久久久久不卡| 久久综合色88| 中文字幕久久久av一区| 成人写真视频福利网| 欧洲精品毛片网站| 亚洲欧洲自拍偷拍| 欧美性猛交xxxx免费看漫画| 26uuu亚洲国产精品| 国产精品香蕉在线观看| 亚洲欧美精品中文字幕在线| 日韩在线视频观看正片免费网站| 国产成人亚洲综合| 欧日韩在线观看| 亚洲国产又黄又爽女人高潮的| 欧美成人精品激情在线观看| 国产成人久久精品| 欧美精品成人在线| 亚洲国产小视频在线观看| 国产精品福利网| 色系列之999| 成人网页在线免费观看| 91久久久久久久久久| 亚洲色图15p| 色伦专区97中文字幕| 精品偷拍各种wc美女嘘嘘| 国产精品国产三级国产aⅴ浪潮| 日韩中文字幕在线视频| 国产一区二区三区四区福利| 国产成人精品在线| 日韩精品视频在线观看免费| 全球成人中文在线| 欧美另类在线观看| 日本久久久久久久| 欧美乱大交xxxxx| 在线成人中文字幕| 久久久精品一区| 久久久国产精品视频| 亚洲男人的天堂在线| 中文字幕国产精品久久| 亚洲国产精品久久久久秋霞蜜臀| 日韩电影大片中文字幕| 色狠狠久久aa北条麻妃| 亚洲第一综合天堂另类专| 姬川优奈aav一区二区| 这里精品视频免费| 国产午夜精品美女视频明星a级| 欧美伊久线香蕉线新在线| 91av在线精品| 亚洲在线www| 国产欧美日韩综合精品| 亚洲桃花岛网站| 69国产精品成人在线播放| 国产精品久久久久久久9999| 亚洲国产精品悠悠久久琪琪| 精品一区电影国产| 国产精品久久久久aaaa九色| 91日韩在线视频| 久久精品国产久精国产一老狼| 亚洲高清久久久久久| 日韩成人av网| 欧美精品一区三区| 国产欧美日韩精品专区| 亚洲欧美制服第一页| 91深夜福利视频| 久久成人精品电影| 亚洲国产精品资源| 日韩中文字幕av| 中文字幕亚洲一区二区三区五十路| 国产91色在线|免| 亚洲精品久久久久中文字幕欢迎你| 国产精品美女免费| 亚洲国产另类 国产精品国产免费| 亚洲视频在线观看免费| 欧美性高跟鞋xxxxhd| 欧美性视频精品| 激情懂色av一区av二区av| 欧美日韩日本国产| 日韩成人在线观看| 亚洲精品www久久久| 成人两性免费视频| 欧美性猛交xxxx免费看久久久| 国产日韩精品在线播放| 亚洲最大福利网站| 久久精品视频网站| 久久九九亚洲综合| 欧美成人在线免费| 国产亚洲精品久久| 国产精品偷伦一区二区| 黑人极品videos精品欧美裸| 日韩在线视频网站| 在线视频日韩精品| 日韩综合视频在线观看| 国产91网红主播在线观看| 91欧美日韩一区| 欧美成人精品一区二区三区| 国产精品激情av电影在线观看| 日韩国产欧美区| 国产色婷婷国产综合在线理论片a| 亚洲成人精品视频在线观看| 亚洲国产私拍精品国模在线观看| 疯狂蹂躏欧美一区二区精品| 亚洲激情中文字幕| 亚洲精品ady| 久久天堂av综合合色| 久久精品中文字幕| 亚洲欧美日韩精品久久奇米色影视| 91视频国产一区| 亚洲性线免费观看视频成熟| 国产精品日韩久久久久| 欧美黑人性视频| 欧美日韩一区二区在线| 精品久久久久久久大神国产| 国产精品一二三视频| 国产欧美精品日韩精品| 清纯唯美亚洲激情| 高跟丝袜一区二区三区| 亚洲最新视频在线| 国内成人精品一区| 欧美大肥婆大肥bbbbb| 夜夜嗨av色一区二区不卡| 成人97在线观看视频| 欧美多人爱爱视频网站| 国产精品欧美在线| 欧美在线精品免播放器视频| 91丨九色丨国产在线| 91香蕉嫩草神马影院在线观看| 国产精品白嫩初高中害羞小美女| 日韩大陆毛片av| 欧美日韩高清在线观看| 日韩中文理论片| 精品成人av一区| 欧美疯狂性受xxxxx另类| 国产主播喷水一区二区| 国产精品久久久久久久久久三级| 色婷婷综合成人av|