簡體   English   中英

來自C#.NET的SQL Server超時2000

[英]SQL server timeout 2000 from C# .NET

我在使用SQL Server 2000和兩個鏈接服務器時遇到了一個奇怪的問題。 兩年來,我們的解決方案一直運行順利,但是昨天突然突然出現了一個查詢,該查詢將數據庫中一個數據庫的數據同步到另一個數據庫。

我連接到生產網絡中的服務器,該服務器鏈接到包含需要數據的訂單的服務器。

該查詢包含一些聯接,但是基本上,這總結了完成的工作:

INSERT INTO ProductionDataCache
   (column1, column2, ...)
   SELECT tab1.column1, tab1.column2, tab2.column1, tab3.column1 ...
       FROM linkedserver.database.dbo.Table1 AS tab1
       JOIN linkedserver.database.dbo.Table2 AS tab2 ON (...)
       JOIN linkedserver.database.dbo.Tabl32 AS tab3 ON (...)
       ...
       WHERE tab1.productionOrderId = @id
       ORDER BY ...

顯然,我解決該問題的第一個嘗試是將超時限制從原來的5分鍾提高到原來的5分鍾。 但是當我到達30分鍾后仍然超時時,我開始懷疑還有其他事情發生。 查詢只是不會從不到5分鍾執行到整夜超過30分鍾。

我將SQL查詢(最初是C#代碼)輸出到日志中,並決定直接在數據庫服務器上的查詢分析器中執行查詢。 令我驚訝的是,查詢在不到10秒的時間內正確執行了。

因此,我在一個簡單的測試程序中隔離了SQL執行,並觀察到最初在運行此解決方案的服務器上以及在數據庫服務器上本地運行該解決方案時,相同的查詢超時。 我也嘗試創建一個存儲過程並從程序中執行此操作,但這也超時。 在Query Analyzer中運行它可以在不到幾秒鍾的時間內正常運行。

看來僅當我從C#程序執行此查詢時,才會出現此問題。 有沒有人以前見過這種行為,並找到了解決方案?

更新:我現在在服務器上使用SQL事件探查器。 明顯的區別是,從.NET程序執行查詢時,它在日志中顯示為“ exec sp_executesql N'INSERT INTO ...'”,但是從查詢分析器執行時,它在日志中作為普通查詢出現。 。

此外,我嘗試使用與程序相同的SQL用戶連接SQL Query Analyzer,這也觸發了Query Analyzer中的問題。 因此,似乎該問題僅在使用sql用戶通過TCP / IP連接時出現。

有幾件事需要調查; 第一個是SET選項; 這些可以對某些查詢產生巨大的影響 查看跟蹤中的SET選項,並在Management Studio(或查詢分析器)中進行測試時重復這些步驟。 請注意,你必須看一下實際的輪廓會真正看到這些(不只是你的代碼日志)。

我接下來要看的是交易。 您在C#中使用哪種交易模型? 任何? 沒有? 什么隔離? 可序列化? 也許是分布式的? 桌子上可能藏着一些晦澀的鎖。

當然,如果鎖定是一個問題,則在運行查詢時,您可能會通過sp_who / sp_who2看到一些信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM