ADO .NET与SQL Server Management Studio – ADO表现更差

我在ADO.NET C#和Sql Server Management工作室中运行相同的命令。 通过C#运行的SQL执行得更糟 – 内存使用情况更糟(耗尽所有可用内存),从而导致数据库执行时间增加。 管理工作室并不完美(它也会导致sql server耗尽内存),但它并不像通过ADO.NET那么糟糕。

我正在运行: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#代码不会调用Go。 每个create cmd都包含在using语句中,并通过ExecuteNonQuery()调用

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

在计算列或索引视图上创建或更改索引时,PS SET ARITHABORT必须为ON。

使用等待和队列方法来调查性能瓶颈。 你会找到根本原因然后我们可以相应地给出建议。 很可能你的C#应用​​程序由于锁而运行并发,很可能由应用程序本身保存。 通常会由于参数嗅探而导致计划更改,如应用程序中的Slow,SSMS中的Fast ,但使用DDL语句时这不太可能。

为什么不将所有命令放入由GO分隔的单个字符串中并将一个字符串发送到数据库?

它叫做SQL批处理。