繁体   English   中英

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

[英]Stored procedure with multiple result sets very slow

我将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.Net 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);

我写了博客文章,其中包含有关此示例应用程序的更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM