<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WizardWu 編程網

      一位臺灣的工程師,接觸 .NET 逾十年,近年研究 SQL Server、Performance Tuning、手機應用

      博客園 首頁 新隨筆 聯系 訂閱 管理

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

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

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


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

      1 DBCC FREEPROCCACHE
      2 
      3 SELECT * FROM Customers SELECT * FROM Orders
      4 GO
      5 SELECT * FROM Customers  SELECT * FROM Orders
      6 
      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 FREEPROCCACHE
      11 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 選項。或者如下圖 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 選項。現在回想起來,其實是不必加的,因為重復用舊的「執行計劃」即可 (可節省許多數據庫伺服器上的資源),丟入的參數也都差不多 (用戶目前所在頁數、每頁要傳回幾條記錄)。

       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 output
      10 WITH RECOMPILE
      11 AS
      View Code

      相關文章 :

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


      posted on 2014-10-31 20:59  WizardWu  閱讀(5494)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 久久伊99综合婷婷久久伊| 在线视频一区二区三区色| 蜜芽久久人人超碰爱香蕉| 亚洲国产综合自在线另类| 中文字幕永久精品国产| 精品久久久久久无码人妻蜜桃| 国产精品美女自慰喷水| 少妇办公室好紧好爽再浪一点| 精品亚洲国产成人av在线| 免费看视频的网站| 永久无码天堂网小说区| 久久久久香蕉国产线看观看伊| 中文字幕av一区二区三区人妻少妇 | 日本夜爽爽一区二区三区| 忘忧草影视| 永久免费在线观看蜜桃视频| 精品久久久久无码| 亚洲aⅴ综合av国产八av| 国产精品v欧美精品∨日韩| 国产对白老熟女正在播放| 精品国产精品三级精品av网址| 国产成人精品一区二三区| 国产一区二区三区导航| 亚洲av成人在线一区| 亚洲大尺度一区二区av| 婷婷成人丁香五月综合激情| 夜夜偷天天爽夜夜爱| 免费无码AV一区二区波多野结衣| 亚洲av日韩在线资源| 精品视频在线观看免费观看| 欧美成人一卡二卡三卡四卡| 无码国模国产在线观看免费| 中国国产免费毛卡片| 国产一区二区三区不卡视频| 四虎国产成人永久精品免费| 久久亚洲中文字幕伊人久久大| av中文字幕国产精品| 国产精品一区二区三区自拍| 极品少妇被猛得白浆直流草莓视频| 成人无码午夜在线观看| 国产亚洲精品国产福APP|