2008-08-13 29 views
27

這是一個問題,我問了另一個論壇,收到了一些體面的答案,但我想看看這裏的人是否有更多的見解。查詢超時從web應用程序,但從管理工作室運行良好

問題是,當Web應用程序中的某個頁面進入存儲過程調用時超時,因此您使用Sql Profiler或應用程序跟蹤日誌來查找查詢並將其粘貼到管理工作室來判斷我們爲什麼運行緩慢。但是你從那裏運行它,它只是開始閃爍,每次返回不到一秒鐘。

我的具體情況是使用ASP.NET 2.0和Sql Server 2005,但我認爲這個問題可能適用於任何RDBMS系統。

+0

我有同樣的問題和http://stackoverflow.com/questions/250713/sqldataadapter-fill-method-slow解決我的問題 – David 2010-06-16 20:22:25

回答

26

這是我從我的研究,學會爲止。

.NET發送的連接設置與登錄管理工作室時獲得的連接設置不同。這裏是你所看到的,如果你聞與SQL事件探查器的連接:

-- network protocol: TCP/IP 
set quoted_identifier off 
set arithabort off 
set numeric_roundabort off 
set ansi_warnings on 
set ansi_padding on 
set ansi_nulls off 
set concat_null_yields_null on 
set cursor_close_on_commit off 
set implicit_transactions off 
set language us_english 
set dateformat mdy 
set datefirst 7 
set transaction isolation level read committed 

我現在粘貼那些我運行到SQL Server登錄時,每個查詢上述設定,以確保這些設置是相同的。

對於這種情況,我在斷開連接並重新連接之後單獨嘗試了每個設置,並發現將arithabort從關閉更改爲開啓將問題查詢從90秒減少到1秒。

最可能的解釋是與參數嗅探有關,這是Sql Server用來挑選它認爲是最有效的查詢計劃的技術。當您更改其中一個連接設置時,查詢優化器可能會選擇一個不同的計劃,在這種情況下,它顯然選擇了一個不合適的計劃。

但我並不完全相信這一點。我試圖在更改此設置後比較實際的查詢計劃,但我還沒有看到差異顯示任何更改。

在某些情況下,arithabort設置可能會導致查詢運行緩慢嗎?

解決方案看起來很簡單:只需將set arithabort放到存儲過程的頂部即可。但是這可能會導致相反的問題:改變查詢參數,突然用'off'比'on'運行得更快。

目前,我正在運行「重新編譯」程序,以確保計劃每次都得到重新生成。對於這個特定的報告來說沒關係,因爲它可能需要一秒鐘才能重新編譯,並且這對於需要1-10秒才能返回的報告(這是一個怪物)並不是很明顯。

但是,對於運行頻率更高,需要儘快返回的其他查詢,只需幾毫秒即可。

+1

+1從SQL事件探查器抓取這些設置並將它們粘貼到Management Studio中是一個很棒的提示,並且幫助我加載。 – 2012-05-10 11:00:25

0

嘗試改變的SelectCommand超時值:

DataAdapter.SelectCommand.CommandTimeout = 120; 
+0

這不是一個解決方案!這是解決方法! – Icet 2017-05-12 11:53:04

1

測試這一點上登臺箱第一,改變它在服務器級別爲SQL Server

聲明@option INT

集@option = @@選項| 64

版EXEC sp_configure '用戶選項', @option

RECONFIGURE

2

你已經打開了ASP.NET跟蹤了嗎?我有一個實例,它不是SQL存儲過程本身的問題,而是該過程返回了5000行,並且該應用程序試圖用導致該問題的5000個項目創建數據綁定ListItems。

您可能會查看Web應用程序函數之間的執行時間以及跟蹤來幫助跟蹤事件。

0

您可以嘗試使用sp_who2命令來查看問題正在執行的過程。這會告訴你它是否被另一個進程阻止,或者使用了過多的cpu和/或io時間。

1

與SQL報告服務相同的問題。 嘗試檢查變量的類型, 我正在向SQL發送不同類型的變量,例如發送varchar到應該是整數的 或類似的地方。 在SQL中,我同步了Reporting Service和存儲過程中的變量類型之後,我解決了這個問題。

6

我有類似的問題。嘗試在sproc create上設置「WITH RECOMPILE」選項,強制系統在每次調用時重新計算執行計劃。有時,查詢處理器會在複雜的存儲過程中遇到大量分支或案例語句的混淆,並且會引發一個非常不理想的執行計劃。如果這似乎「解決」了問題,則可能需要驗證統計信息是否是最新的和/或是否破壞了存儲過程。

您也可以通過分析存檔來確認此情況。從SQL管理工作室執行它時,IO如何與從ASP.NET應用程序中進行分析時進行比較。如果它們非常多,它只會重新強調它拉動了一個糟糕的執行計劃。

0

我們有同樣的問題,這裏是我們發現的。

我們的數據庫日誌大小保持在默認值(814 MB),自動增長率爲10%。 在服務器上,最大服務器內存也保持默認設置(2147483647 MB​​)。

當我們的日誌滿了並需要增長時,它使用了服務器的所有內存,並且沒有任何代碼可以運行,因此超時。我們最終做的是將數據庫日誌文件初始大小設置爲1 MB,將最大服務器內存設置爲2048 MB。這瞬間解決了我們的問題。當然,您可以更改這兩個屬性以適應您的需求,但是這對於通過代碼執行存儲過程時遇到超時問題的人來說是個想法,但它在SSMS中運行速度超快,而上述解決方案無助於此。

相關問題