具有多个结果集的存储过程非常慢

本文关键字:存储过程 非常 结果 | 更新日期: 2023-09-27 18:18:49

我使用EF6与ObjectContext + edmx模型。存在一个具有多个结果集的存储过程。事实证明,每次我们调用。getnextresult时,它都会动态编译新方法,造成巨大的开销和性能损失。我使用Perfview和JIT编译统计来解决这个问题。

using (var db = new SomeEntities()) 
{ 
    var resultSet1 = db.GetAllData(); 
    // handle result set 1 data
    // This causes new dynamically emitted method to be JIT-compiled.
    var resultSet2 = resultSet1.GetNextResult<Class2>(); 
}

是否有办法消除动态编译,仍然使用。getnextresult ?到目前为止,我必须回到旧的ADO.net数据阅读器如MSDN

具有多个结果集的存储过程非常慢

所示

我找到了比。getnextresult更快的解决方案,同时与ADO相比,更少的"手动"。净DataReader。它是。translate方法。有一篇MSDN文章描述了如何使用它。基本上

var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = "[dbo].[GetAllBlogsAndPosts]";
db.Database.Connection.Open();
var reader = cmd.ExecuteReader();
// Read first result set
var blogs = ((IObjectContextAdapter)db).ObjectContext.Translate<EFStoredProcJit.Blog>(reader, "Blogs", MergeOption.AppendOnly);
// Read 2nd result set
reader.NextResult();
var posts = ((IObjectContextAdapter)db).ObjectContext.Translate<EFStoredProcJit.Post>(reader, "Posts", MergeOption.AppendOnly);

我写了一篇关于这个和示例应用程序的更多细节的博客文章。