Linq到Sql Udf调用比普通Ado.net更快



我们有一个在数据库中调用用户定义函数的遗留应用程序。这个Udf返回一个非常大的xml字符串(大约1971540个字符)。令人惊讶的是,linq到sql的ExecuteMethodCall运行得非常快,而普通的Ado。Net DbDataReader.GetString()很慢!!

我们已经对调用进行了基准标记,L2S可以在4秒内获取它,而普通Ado.net DbDataReader.GetString()可以在37秒内获取它。

查看L2S代码,它似乎使用相同的DbDataReader.GetString()方法,尽管通过动态生成IL代码。http://referencesource.microsoft.com/System.Data.Linq SqlClient/读者/ObjectReaderCompiler.cs b2f6633a6c502138

我想知道是什么让L2S在这么短的时间内读取这么大的数据?

请注意,即使在第一次调用时它也运行得足够快,所以它可能不是缓存魔法。

编辑

using (DbConnection con = _dataContext.Database.Connection)
{
    DbCommand cmd = con.CreateCommand();
    cmd.CommandText = sql;
    cmd.Transaction = _dataContext.Database.CurrentTransaction.UnderlyingTransaction;
    parameters.Cast<System.Data.SqlClient.SqlParameter>().ToList().ForEach(x => cmd.Parameters.Add(x));
    cmd.CommandTimeout = 500;
    if (con.State != System.Data.ConnectionState.Open)
        con.Open();
    using (var reader = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess | System.Data.CommandBehavior.SingleResult | System.Data.CommandBehavior.SingleRow))
    {
        if (reader.Read())
        {
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            var data = reader.GetString(0);
            sw.Stop();
            var et = sw.Elapsed.TotalSeconds;
        }
    }
}

问候。

最后经过深思熟虑和调整…原来是MARS配置的问题!!

MARS在我们最新重构的代码中被打开(我认为是EF的默认行为),而它在Linq到sql的连接字符串中不存在。

一旦我们从连接字符串中删除"MultipleActiveRecordSets=True;",它就可以正常工作了。不确定为什么移除MARS会有效。

最新更新