簡體   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