2014-01-13 40 views
5

背景 - 我有一個網站&這是一個windows預定作業,它是MSI的一部分,並安裝在同一臺服務器上。最終用戶使用該網站創建一些規則,並且該作業計劃每天運行以爲最終用戶創建的規則創建平面文件。實際的情況比上面解釋的要複雜得多。運行存儲過程時出現不明原因超時

問題(與網站) - 該網站大多數時間都工作正常,但有些時候它只是不會加載規則創建頁面 - 而異常被記錄它'查詢超時或SQL服務器沒有響應'

問題(有工作) - 作業與異常行爲就像網站和失敗有時 - 「查詢超時或不響應SQL服務器」

我已經試過 -

  • 我在SQL連接字符串中添加了'Connection Timeout' - 似乎沒有幫助記錄 - 它會告訴我它是SQL連接超時還是查詢超時。
  • 我也運行被網站&作業調用的存儲過程 - 和ALL存儲過程在業務定義的超時3600秒內完成。存儲過程實際上在一分鐘內完成。
  • 我也運行SQL事件探查器 - 但TRACES也沒有幫助我 - 儘管我可以看到很多事務,但我無法證明服務器有問題。

我在找什麼 - 有沒有其他原因可能導致這種情況?有什麼我可以找的?

技術 - SQL Server 2008 R2中,ASP.Net,C#.NET

限制 - 代碼的細節不能透露,由於客戶保密,但我接受的問題 - 這我會盡力回答客戶的保密問題。

注意 - 已經有一個查詢超時的應用程序了配置文件中定義(3600)&連接超時 (30秒)。

+0

不知道MS SQL:我會建議增加日誌詳細程度並監視此行爲。 – Samuel

+0

有沒有特定的時間查詢/工作緩慢,或者是隨機的?順便說一下,上面沒有足夠的信息。如果您可以將部分代碼與業務邏輯或保密內容刪除,它會有所幫助。 – SchmitzIT

+1

@suyashKhandwe檢查是否正確處理連接對象。 –

回答

0

所以,我在這裏和那裏嘗試了一些東西,並能找出根源 -

SQL存儲過程中加入2級不同的數據庫2頁表 - 其中一個已經變的記錄數 - 這些記錄正在被不同的(第三方)工作更新/插入。由於第三方工作和我的工作時間不同 - 由於表鎖定沒有出現問題,但由於記錄數量過多,導致我的工作在超時時間不足時超時。

但是,正如我所說的,我已經給出了3600秒的業務標準命令超時 - 某種程度上企業庫正在重寫我的自定義超時,其默認命令超時時間爲30秒 - 因此C#代碼部分會引發異常甚至在存儲過程完成執行之前。

我做了什麼 - 這可能是我們中的一些幫助 -

  1. 我從項目
  2. 盪滌我的解決方案,並簽入SVN刪除企業圖書館的參考。
  3. 然後清理SVN。
  4. 在刪除企業庫引用後,我沒有構建應用程序 - 顯然它不會由於引用錯誤而生成。
  5. 之後,我進行了一次乾淨的結帳並再次添加了Enterprise Library。

現在它似乎工作,即使有不同數量的記錄。

0

我與mssql有類似的問題,並沒有找到這種不穩定的行爲的任何特定原因。我的解決辦法是讓DB重新索引與

sp_updatestats

每小時

+0

請注意,如果您的數據庫需要每小時重建一次索引,則應認真查看填充因子! – Liath

+0

對於我們的服務器資源,每小時重新索引數據庫可能代價過高 - 我們處理大量數據(我在談論某些表中的數據量高達1000萬行數據),並且每小時將這些數據編入索引可能會減慢數據庫 –

0

您可以使用WITH RECOMPILE在您的存儲過程的定義,以避免的錯誤「查詢超時或SQL服務器沒有響應」

下面是微軟的文章:
http://technet.microsoft.com/en-us/library/ms190439.aspx

也看到供參考:
SQL Server: Effects of using 'WITH RECOMPILE' in proc definition?

示例代碼:

CREATE PROCEDURE [dbo].[sp_mystoredproc] (@param1 varchar(20) ,@param2 int) 
WITH RECOMPILE 
AS 
... proc code ... 
+2

這不起作用 - 最可能背後的原因可能是問題出在我的C#代碼而不是SQL部分。 –

1

昨天也有同樣的問題。有一個巨大的查詢需要18秒的SQL Server,但即使在200秒後仍然用完C#。我重新啓動我的電腦斷開數據庫,甚至斷開服務器......沒有任何改變。

閱讀了一些線程後,我注意到一個關於索引的公共提要。所以我刪除了我的數據庫中的一些索引,放了一些回來,並瞧!恢復正常。

這可能是我以爲可能發生了。當我正在進行一些測試時,我可能還有一些殭屍連接,我的同事同時在數據庫中創建了一些表,並將它們鏈接到存儲過程中使用的表。即使新創建的表與存儲過程無關,但將它們與其他鏈接關聯起來似乎與索引混淆了。爲什麼只有C#不能正常工作?我的猜測是SQL Server中的內存緩存不能直接連接到SQL Server以外的地方。

N.B.就我而言,只是改變存儲過程根本沒有任何作用,即使它是一些線程中常見的「解決方案」。

希望這有助於如果有人有同樣的問題。如果有人能找到更好的解決方案/解釋,請分享!

乾杯,

相關問題