2010-05-07 17 views
8

我們在測試和開發環境中遇到了一個問題,該函數在被調用時運行速度相當慢來自.Net應用程序。當我們直接從管理工作室調用這個函數時,它工作正常。當從.Net應用程序調用SQL函數時vs與在Management Studio中調用相同的調用時爲什麼會有性能差異

下面是當他們被異形的差異: 從應用:
CPU:906
閱讀次數:61853
寫入:0
時間:926

從SSMS:
CPU: 15
閱讀次數:11243
寫:0
持續時間:31

現在我們已經確定,當我們從應用程序運行時編譯功能的性能恢復到我們所期望和性能配置相匹配的,當我們從SSMS中運行它,我們得到什麼。它會以隨機間隔再次開始減速。

我們在prod中沒有看到它,但它們可能部分是因爲每週都會重新編譯一次。

那麼,什麼可能導致這樣的行爲?

編輯 -
我們終於能夠解決這個問題,重構變參數來處理參數嗅探似乎已經做了訣竅......我們在這裏所做的一個片段:感謝您的幫助。

 -- create set of local variables for input parameters - this is to help performance - vis a vis "parameter sniffing" 
    declare @dtDate_Local     datetime 
      ,@vcPriceType_Local    varchar(10) 
      ,@iTradingStrategyID_Local  int 
      ,@iAccountID_Local    int 
      ,@vcSymbol_Local    varchar(10) 
      ,@vcTradeSymbol_Local   varchar(10) 
      ,@iDerivativeSymbolID_Local  int 
      ,@bExcludeZeroPriceTrades_Local bit 

    declare @dtMaxAggregatedDate  smalldatetime 
      ,@iSymbolID    int 
      ,@iDerivativePriceTypeID int 

    select @dtDate_Local     = @dtDate 
      ,@vcPriceType_Local    = @vcPriceType 
      ,@iTradingStrategyID_Local  = @iTradingStrategyID 
      ,@iAccountID_Local    = @iAccountID 
      ,@vcSymbol_Local    = @vcSymbol 
      ,@vcTradeSymbol_Local   = @vcTradeSymbol 
      ,@iDerivativeSymbolID_Local  = @iDerivativeSymbolID 
      ,@bExcludeZeroPriceTrades_Local = @bExcludeZeroPriceTrades 
+0

請張貼實際的代碼... – gbn 2010-05-07 05:11:25

+0

我們將研究參數嗅探解決方案。這篇文章給了它很好的解釋,以及如何解決它。 http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/ – 2010-05-07 16:17:01

回答

4

這通常是因爲您在SSMS連接中獲得了不同的執行計劃。往往涉及到參數嗅探在當計劃得到一些對參數的其他值次優的特定值產生的問題。這也解釋了重新編譯會解決問題的原因。此線程似乎有一個很好的解釋Parameter Sniffing (or Spoofing) in SQL Server

5

我有類似的問題存儲過程,對我來說,它竟然是'參數嗅探'。谷歌認爲,看看它是否解決您的問題,對我來說是戲劇性的加快,一旦我固定它。

在我的情況下,我通過爲傳入的每個參數聲明一個局部變量,然後將局部變量賦值給該參數值,並使用局部變量處理...來修復它。無論出於何種原因,這都擊敗了參數嗅探。

4

可能的原因是過時的統計信息和/或參數嗅探導致緩存的查詢計劃重新使用,這是次優的。

SSMS發出您看不到的前導碼語句,這會導致提交的查詢每次被重新編譯,從而消除使用不正確的緩存計劃的可能性。

這將更新所有統計信息,並刷新視圖和存儲的特效(但要小心,用於生產的機器上運行):

EXEC sp_updatestats 

EXEC sp_refreshview 

EXEC sp_msForEachTable 'EXEC sp_recompile ''?''' 
相關問題