2011-09-01 42 views
0

我跑在ADO.NET C#和SQL Server Management Studio中相同的命令。通過C#運行的SQL性能明顯更差 - 內存使用情況更糟(耗盡所有可用內存),從而導致數據庫執行時間增加。管理工作室並不完美(它也會導致sql server耗盡內存),但並不像通過ADO.NET那樣糟糕。ADO .NET與SQL Server Management Studio中 - ADO執行得很差

我運行:Windows 7中時,SQL Server 2008 R2,10.50.1600。 C#.NET 3.5。 Sql Server管理Studio 2008 R2。所有的程序和數據庫都在我的本地開發機器上。

我上運行的SQL是40創建視圖的40創建2數據庫的唯一索引。我需要在運行時執行此操作,因爲我們正在兩個數據庫之間運行數據庫比較(由於不相關的原因,我們需要比較視圖而不是表格)。由於業績是一個問題,我們不能一直留下觀點和指數。

的SQL是這樣的:

create view [dbo].[view_datacompare_2011106] with schemabinding as ( 
SELECT t.[ID], t.[Column1], t.[Column2], t.[Column3], FROM dbo.Table t WHERE t.[ID] in ('1','2','3','4')) 
go 
create unique clustered index [index_datacompare_2011106] on [dbo].[view_datacompare_2011106] (ID) 
go 
... 

唯一的區別是,C#代碼不叫去。每個create cmd都包含在一個using語句中,並通過ExecuteNonQuery()調用,例如

using (SqlCommand cmd = new SqlCommand(sql, this.connectionActualDb)) 
{ 
cmd.CommandTimeout = Int32.Parse(SqlResources.TimeoutSeconds); 
cmd.ExecuteNonQuery(); 
} 

P.S.當您在計算列或索引視圖上創建或更改索引時,SET ARITHABORT必須爲ON。

+0

可能重複:http://stackoverflow.com/questions/9974/query-times-out-from-web-app-but-runs-fine-from-management-studio或http://stackoverflow.com/問題/ 2465887/why-will-set-arithabort-on-dramatic-speed-up-a-query或http://stackoverflow.com/questions/2736638/sql-query-slow-in-net-application-but- instantaneous-in-sql-server-management-stu –

+1

您是否比較過執行計劃? – Justin

+0

值得指出的是它不是一個ADO問題。如果您追蹤.net的查詢,您會看到它在調用sp_executesql的過程中執行。如果你使用這個查詢並在SSMS中運行它,它就像從ADO運行一樣慢。在視圖上創建聚簇索引的 – Daz

回答

0

使用Waits and Queues方法調查性能瓶頸。你會找到根本原因,然後我們可以提供相應的建議。很可能您的C#應用​​程序由於鎖定而運行併發,很可能由應用程序本身持有。通常,由於參數嗅探導致計劃更改,如Slow in the Application, Fast in SSMS,但對於DDL語句,這不太可能。

+0

執行視圖。 – kerem

-1

你爲什麼不把所有的命令到由GO分隔的一個字符串和一個字符串發送到數據庫?

它被稱爲SQL批處理。

+0

-1因爲批次不能包含GO。 GO是批量*分隔符*,不屬於T-SQL語法的一部分。如果您希望在發出命令之前運行完整的.sql文件並分離這些批處理,但您可以使用http://code.google.com/p/dbutilsqlcmd/這樣的操作,但SqlCommand不會理解GO並將其發送到服務器,導致錯誤。 –

+0

我不同意。我們一直這樣做。我們將多個SQL語句生成爲一個字符串,然後將該字符串作爲針對數據庫執行的sql命令的命令文本發送。 – tsells

+0

GO分隔?我知道在服務器上解析時會觸發錯誤,所以你必須做其他事情。 –