Sql server 2005 为什么SQLCLR进程比同一代码客户端运行得慢
我正在编写一个存储过程,该过程完成后将用于逐列扫描临时表以查找虚假数据 练习的第一步只是扫描表格——下面的代码就是这么做的。问题是这段代码运行时间为5:45秒,而与控制台应用程序(当然是更改连接字符串)运行的代码运行时间约为44秒Sql server 2005 为什么SQLCLR进程比同一代码客户端运行得慢,sql-server-2005,sqlclr,Sql Server 2005,Sqlclr,我正在编写一个存储过程,该过程完成后将用于逐列扫描临时表以查找虚假数据 练习的第一步只是扫描表格——下面的代码就是这么做的。问题是这段代码运行时间为5:45秒,而与控制台应用程序(当然是更改连接字符串)运行的代码运行时间约为44秒 using (SqlConnection sqlConnection = new SqlConnection("context connection=true")) { sqlConnection.Open(); str
using (SqlConnection sqlConnection = new SqlConnection("context connection=true"))
{
sqlConnection.Open();
string sqlText = string.Format("select * from {0}", source_table.Value);
int count = 0;
using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection))
{
SqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
count++;
SqlDataRecord record = new SqlDataRecord(new SqlMetaData("rowcount", SqlDbType.Int));
SqlContext.Pipe.SendResultsStart(record);
record.SetInt32(0, count);
SqlContext.Pipe.SendResultsRow(record);
SqlContext.Pipe.SendResultsEnd();
}
}
然而,相同的代码(当然是不同的连接字符串)在控制台应用程序中运行大约44秒(这更接近我在客户端的预期)
我在SP端遗漏了什么,这会导致它运行得如此缓慢
请注意:我完全理解,如果我想计算行数,我应该使用count(*)聚合——这不是本练习的目的。好吧,答案似乎还是在连接字符串中
context connection=true
对
server=(local); database=foo; integrated security=true
出于某些奇怪的原因,使用“外部”连接,SP的运行速度几乎与控制台应用程序一样快(请注意,仍然没有控制台应用程序那么快!——55秒)
当然,现在必须将程序集部署为外部而不是安全的,这会带来更多的挫折。您正在编写的代码类型非常容易受到SQL注入的影响。您可以使用RecordsAffected属性查找读取器中的行数,而不是像现在这样处理读取器 编辑:
在做了一些研究之后,您看到的差异是上下文连接和常规连接之间的设计差异。彼得·德贝塔在博客中写道: 编写上下文连接时,它一次只获取一行,因此对于2000多万行中的每一行,代码分别请求每一行。但是,使用非上下文连接时,它一次请求8K行
问题不在于sql注入攻击,也不在于获取行数,而是在于SqlDataReader的性能,这就是为什么我要包含原始免责声明。在做了一些研究之后,您看到的差异是上下文连接和常规连接之间在设计上的差异。Peter Debetta在博客中写道:“编写上下文连接时,每次只获取一行,因此对于2000多万行中的每一行,代码分别请求每一行。但是,使用非上下文连接时,它一次请求8K行。”