Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 为什么SQLCLR进程比同一代码客户端运行得慢_Sql Server 2005_Sqlclr - Fatal编程技术网

Sql server 2005 为什么SQLCLR进程比同一代码客户端运行得慢

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

我正在编写一个存储过程,该过程完成后将用于逐列扫描临时表以查找虚假数据

练习的第一步只是扫描表格——下面的代码就是这么做的。问题是这段代码运行时间为5:45秒,而与控制台应用程序(当然是更改连接字符串)运行的代码运行时间约为44秒

    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行。”