2011-09-01 55 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分隔?我知道在服务器上解析时会触发错误,所以你必须做其他事情。 –