2013-02-26 40 views
4

我有一個查詢(大約1600行存儲爲存儲過程),在SQL Server Management Studio中執行時需要大約3秒鐘的時間執行(通過添加正確的索引進行優化後)。查詢在SQL Server中直接在4秒內執行,但在ASP.NET中需要超過30秒?

我在C#中爲此編寫了一個包裝,並提供了使用URI執行此查詢的功能。但是,這需要超過30秒的時間才能執行,因此,當我將此查詢作爲循環的一部分運行時,瀏覽器由於有太多未決請求而停頓。我寫了這樣的包裝:

try 
{ 
    string ConString = Constants.connString; 

    using (con = new SqlConnection(ConString)) 
    { 
     cmd = new SqlCommand(sql, con); 
     con.Open(); 
     dr = cmd.ExecuteReader(); 

     while (dr.Read()) 
     { 
     ... 
     } 
    } 
} 

我的連接字符串是:

Data Source={0};Initial Catalog={1};Integrated Security=True;MultipleActiveResultSets=true 

我知道查詢本身是好的,因爲我碰到這裏面SSMS多次,它工作得很好(下平均5秒)。而且,我很樂意提供更多的調試信息,除了我不知道該提供什麼。

要解決這些問題,我會從哪裏開始?

編輯:

我跑SQL事件探查器,並收集了一些統計數據。這就是我所觀察到的。很奇怪,它是正在執行的確切查詢。讓我知道在這一點上我還有什麼可以做的。

enter image description here

+2

在哪條線和哪條線之間需要30秒? – 2013-02-26 20:35:46

+0

@MikeChristensen:它停在'cmd.ExecuteReader()'處。 – Legend 2013-02-26 20:36:50

+0

你是說SQL命令字符串是1600行,還是說它返回1600行? – RBarryYoung 2013-02-26 20:37:02

回答

8

好的;最後,找到答案herehere。爲方便起見,在這裏複製答案。非常感謝原始海報Jacques Bosch,他們從here開始。不能相信這個問題在2004年得到解決!

該問題似乎是由SQL Server的Parameter Sniffing引起的。 爲了防止它,只需將您的傳入參數值分配給SP頂部正確聲明的其他變量。

See this nice Article about it

實施例:

CREATE PROCEDURE dbo.MyProcedure 
(
    @Param1 INT 
) 
AS 

declare @MyParam1 INT 
set @MyParam1 = @Param1 

SELECT * FROM dbo.MyTable WHERE ColumnName = @MyParam1 

GO 

我從eggheadcafe.com複製該信息。

0

爲什麼不u使用XML,而不是一個結果集? 據我所知,使用XML比讀取結果集要快得多。 所以在這種情況下,你應該使用這樣的事情:

SELECT * 
FROM [Table Name] 
FOR XML PATH('[Your Path]'), ELEMENTS XSINIL, ROOT('Your Root') 

之後,我覺得你可以在你的項目序列化。

0

我有同樣的問題一次,事實證明,該差值被ARITHABORT設置,如果你通過SQL Management Studio中連接是不同造成的。在.NET連接ARITHABORT設置設置爲OFF,而SQL Management Studio中設置此設置ON

你可以嘗試,如果你必須在SQL Management Studio中執行SET ARITHABORT OFF同樣的問題,然後執行查詢。

Here is a thread解釋了爲什麼這種設置可能會導致這種顯着的性能差異。

相關問題