2011-01-14 82 views
0

我有一個C#應用程序,表現ETL過程。對於自引用表,應用程序將運行「ALTER TABLE [tableName] NOCHECK CONSTRAINT [constraintName]」,關閉此表的任何FK約束(s)檢查。一旦所有的數據被加載,約束(s)被再次啓用。ALTER TABLE NOCHECK CONSTRAINT超時隨機

數據庫超時設置爲3分鐘,但是,上面的SQL命令會因30秒內的數據庫超時而失敗。

什麼可能是這個超時的原因?

是否有數據庫系統表我應該檢查異常?

其他信息: 我檢查了應用程序,它只有一個活動線程在執行ETL,所以我不認爲應用程序鎖定了任何數據庫資源。另外,數據庫與應用程序在同一臺機器上運行。

事件應用程序關閉其所有數據庫連接,如果它下次運行ETL過程,它將再次超時。如果我使用SQL Manager Studio手動運行SQL,它完全沒有問題。

謝謝

更新 - 應用程序正在關閉一些約束。事實證明,超時只發生在1個特定的約束條件下。此約束是引用日期維度表。

更新 - 它看起來像我工作的測試數據庫有一些奇怪的異常。我嘗試了與其他數據倉庫相同的ETL過程,到目前爲止它沒有問題。團隊中的其他開發人員也沒有遇到過這個問題。此應用程序每半夜運行一次。我會保持它一夜之間運行,並希望我可以在其他數據庫上重現相同的問題。到目前爲止,沒有運氣來弄清楚發生了什麼事情。

+0

你提到'數據庫超時設置爲3分鐘...'你在哪裏做這個設置?從您的問題中可以看出,30秒內的默認時間仍然如此。 – 2011-01-14 17:30:12

+0

儘管事實上你認爲沒有其他的連接關係,但我會認爲原因會被阻止。我會想象這將是一個快速的元數據更改,所以延遲的唯一範圍將等待`Sch-M`鎖定。 – 2011-01-14 18:04:49

回答

2

更改表格需要對錶格進行排它鎖定。如果有另一個進程正在讀取/寫入正在討論的表,那麼在該進程釋放其鎖之前,無法進行模式更改。

當您經歷表的長時間運行時,請在不同的連接中運行sp_who2,並查看是否有任何連接阻塞了ETL連接。然後,您可以查看該連接的命令緩衝區,以確定其操作。