我正在使用 Entity Framework 4(数据库优先)开发电影数据库应用程序,将大约 8,200 行加载到列表中需要 30 秒。涉及三个表,当我使用 .Include() 时,性能下降得更多——加载 8,200 行几乎需要三分钟。这很痛苦。鉴于我一次学习了很多技术,我希望有一个简单的解决方法。以下是详细信息:
表 1 - 视频
这是一个大表,有 31 列,大约 7,800 行视频。它使用 Guid 作为其主键。
表 2 - ActorsVideos(连接表)
该表有两列:(1) VideoID 列,和 (2) ActorID 列。这两列都是 Guid,分别是 Video 和 Actor 表的外键。此表使用复合主键,其中两列都充当主键。EF4 不对这个表建模;但是,它会创建一个导航属性。该表允许用户为电影分配任意数量的演员。
表 3 - 参与者
有 16 列约 400 行。同样,主键是 Guid。
在代码中,我正在读取 Videos 表中的大约 10 列,然后从关联的 Actors 表中读取列。
C# 代码如下所示:
var videos = context.Videos
foreach (var video in videos)
{
// retrieve 10 or so properties from 'video'
if (video.Actors.Count > 0)
{
foreach (var actor in video.Actors)
{
// retrieve some properties on the actor
}
}
}
我尝试在 context.Videos 之后添加 .Include("Actors") ,如上所述,性能从可怕变为可怕。
我查看了使用 Include 生成的 SQL,考虑到视频表中的列数,它大约有 2K 的文本。
我是否必须使用主/从模式拆分视频表?我的下一步是缓存演员表并完全避免导航/关联属性。还有其他建议可以加快速度吗?在我看来,它应该在 5-6 秒内运行。
编辑:数据库是 SQL Server CE 3.5。