ADO .NET 与 SQL Server Management Studio - ADO 性能更差

Posted

技术标签:

【中文标题】ADO .NET 与 SQL Server Management Studio - ADO 性能更差【英文标题】:ADO .NET vs. SQL Server Management Studio - ADO performs worse 【发布时间】:2011-09-01 15:59:46 【问题描述】:

我在 ADO.NET C# 和 Sql Server Management Studio 中运行相同的命令。通过 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 个数据库上创建唯一索引。我需要即时执行此操作,因为我们正在运行 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();

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

【问题讨论】:

可能重复:***.com/questions/9974/… 或 ***.com/questions/2465887/… 或 ***.com/questions/2736638/… 你比较过执行计划吗? 可能值得指出这不是 ADO 问题。如果您从 .net 跟踪查询,您会看到它是在对 sp_executesql 的调用中执行的。如果您获取此查询并在 SSMS 中运行它,它与从 ADO 运行一样慢。 【参考方案1】:

使用Waits and Queues 方法来调查性能瓶颈。您会找到根本原因,然后我们可以提供相应的建议。很可能您的 C# 应用程序由于锁而运行并发,很可能由应用程序本身持有。通常有人会指责由于参数嗅探导致的计划更改,如Slow in the Application, Fast in SSMS,但对于 DDL 语句,这不太可能。

【讨论】:

在视图上创建聚集索引会执行视图。【参考方案2】:

你为什么不把所有的命令放在一个用 GO 分隔的字符串中,然后将一个字符串发送到数据库呢?

这叫做 SQL 批处理。

【讨论】:

-1 因为一个批次不能包含 GO。 GO 是一个批处理 delimiter 并且不是 T-SQL 语法的一部分。如果你想在发出命令之前运行整个 .sql 文件并分离批次,你可以使用code.google.com/p/dbutilsqlcmd 之类的东西,但是 SqlCommand 不会理解 GO 并将其发送到服务器,从而导致错误。 我不同意。我们一直这样做。我们将多个 SQL 语句生成为单个字符串,然后将该字符串作为正在对数据库执行的 sql 命令的命令文本发送。 被GO分隔?我知道在服务器上解析时会触发错误的事实,所以你必须做其他事情。 是的。我们有我们定制的 DAL 设置来做到这一点。我们以这种方式传递多个语句。我们为多次插入、删除等执行此操作。您不需要将所有这些都放在一个“批处理”中。每条语句都是独立于下一条的——它们都需要被执行。

以上是关于ADO .NET 与 SQL Server Management Studio - ADO 性能更差的主要内容,如果未能解决你的问题,请参考以下文章

csharp Sql Server Ado.NET

通过 ADO.NET 访问 SQL Server 消息

ADO。NET 紧急!!!!高手请进。

如何为 SQL Server 和 SQL Server Compact 编写相同的 ado.net 代码?

使用 ADO.NET 将数据表从内存推送到 SQL Server

C#:通过 ADO.NET 在 SQL Server 2008 上运行事务