【发布时间】: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。
【问题讨论】:
-
你比较过执行计划吗?
-
可能值得指出这不是 ADO 问题。如果您从 .net 跟踪查询,您会看到它是在对 sp_executesql 的调用中执行的。如果您获取此查询并在 SSMS 中运行它,它与从 ADO 运行一样慢。
标签: c# sql sql-server memory