正如标题所示,我在使用Entity Framework对SQL Server数据库进行第一次查询时遇到问题.
我试过在不同的网站上寻找答案,但似乎没有人真正找到解决方案.
我从数据库中加载了很多行,包括两个0-many关系.
使用Entity Framework 4.0 Model和POCO生成器在Visual Studio 2010中完成测试(普通实体和POCO对象之间的时序差别不大).我还使用T4视图模板预编译视图.
该数据库位于SQL Server 2008上.
我真正想知道的是为什么第一个查询比任何二级查询都慢得多.
我还想知道是否可以采取措施将第一个查询的速度提高到可接受的范围内.
这是一个很大的查询,我们可能会得到更大的其他查询,并且可以理解它们可能有点慢但是30秒对于用户来说太慢了等待,特别是当数据集可以更快地获得相同的数据时.
我已经做了一些时间测试,试图找出问题所在,我有点惊讶地发现它看起来像第一次查询的SQL Server速度慢.
时间安排如下:
.NET测试应用程序:
SQL事件探查器:
SQL Server查询窗口
申请中的时间是用Stopwatch班级测量的.仅测量了查询并.ToList()用于执行查询.
SQL Server Profiler中的计时用于在应用程序中执行的相同查询,该查询显示应用程序仅使用大约2,6秒将数据填充到对象中.
最后27秒用于在SQL Server上执行查询.
查看辅助查询,应用程序和SQL服务器的计时相同,但这次执行查询的速度要快得多.
我可以理解为什么应用程序不会随时使用,因为没有新行需要转换为对象,但为什么查询速度要快得多,因为执行计划而不是24秒,我预计会有几秒钟.
出于测试目的,我复制了实体框架生成的SQL,并打开了一个带有单独连接的新查询窗口,并在其中执行了查询.
如您所见,第一个查询需要8秒,第二个查询需要4秒.
我希望有人有一些建议.
PS.我为文字墙道歉:)
编辑19-10-2010:
昨天我做了一个测试似乎支持以顺序方式返回行.这意味着当从数据库返回一行时,它会立即实现(如果它在上下文中尚不存在),则返回下一行,依此类推.
这就是为什么查询在数据库服务器上占用大量时间的原因,因为实现时间包含在SQL Server探查器计时中.
我不相信这是从硬盘读取SQL Server的情况.每次在EF中存在"第一个查询"时,都会发生慢速查询.
恩.
这几乎就像EF发送一些选项以及使服务器变慢的第一个查询.
至于查询编译,我记得第一次使用它时编译了查询,这意味着第一个查询执行的时间会更长.
辅助查询会更快,但辅助查询的速度不是问题.
我还做了一个测试,我在其中创建了一个编译的查询作为静态,以便为所有创建的上下文编译它.
然后我创建了一个上下文,运行查询,销毁了上下文并创建了一个新的并再次运行相同的查询.
差异不是那么大,只有几秒钟,而且我第一次运行查询时,它仍然只需要预先编译就可以了.
至于视图生成,我们已经使用T4模板实现了这一点.
答案真的是EF只有在除了只返回相对少量数据的最简单查询之外什么都不做的情况下才有效吗?
这是前一个问题的后续跟进,我试图找出代码运行缓慢的主要原因.我想我已经把它缩小到下面的一个最小例子.我有一个基本的数据库结构如下:
public class Foo
{
public int Id { get; set; }
public string Bar { get; set; }
}
public class FooContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个Foo对象列表,并希望将它们添加到数据库,建议的方法是使用AddRange().但是我注意到它花了很长时间,并且受到集合中项目数量的影响很小,即使是200这样的少量.所以我手动编写了它,并且中提琴,它运行得更快!
class Program
{
static void Main(string[] args)
{
var foos = Enumerable.Range(0, 200).Select(index => new Foo { Bar = index.ToString() });
// Make sure the timing doesn't include the first connection
using (var context = new FooContext())
{
context.Database.Connection.Open(); …Run Code Online (Sandbox Code Playgroud) 我有大约 40 个实体,每次编译并运行我的应用程序后,第一次调用 DbContext 都会花费近 10 秒的时间。有没有办法让它运行得更快?
\n\n这是当用户已经登录我的应用程序时我在第一次通话时所做的事情
\n\n页面模型
\n\npublic class CreateModel : PageModel\n{\n private readonly IToastNotification _toastNotification;\n private readonly ICelulaService _celulaService;\n\n public CreateModel(IToastNotification toastNotification, ICelulaService celulaService)\n {\n _toastNotification = toastNotification;\n _celulaService = celulaService;\n }\n\n public IList<Celula> Celulas { get; set; }\n\n public void OnGet()\n {\n Celulas = _celulaService.GetAutomated();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n服务与接口
\n\npublic interface ICelulaService\n{\n IList<Celula> GetAutomated();\n}\n\npublic IList<Celula> GetAutomated()\n{\n return _context.Celulas\n .Where(c => c.Automated)\n .ToList();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n该模型
\n\n[Table("hCelulas")]\npublic class Celula\n{\n public int Id { get; …Run Code Online (Sandbox Code Playgroud)