C# 使用常规linq创建编译查询linq和性能问题

C# 使用常规linq创建编译查询linq和性能问题,c#,asp.net,asp.net-mvc,linq,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Linq,Asp.net Mvc 4,我当前有一个查询,如下所示: using (var ctx = new myEntities()) { ctx.Configuration.LazyLoadingEnabled = false; ctx.Configuration.ProxyCreationEnabled = false; ctx.Database.CommandTimeout = 200; competitors = DBRetry.Do(() => ctx.SearchedUsers

我当前有一个查询,如下所示:

 using (var ctx = new myEntities())
 {
    ctx.Configuration.LazyLoadingEnabled = false;
    ctx.Configuration.ProxyCreationEnabled = false;
    ctx.Database.CommandTimeout = 200;
    competitors = DBRetry.Do(() => ctx.SearchedUsers.AsNoTracking().Where(x => x.InQueue == true).OrderBy(x => x.LastUpdatedAt).Take(2000).ToList(), TimeSpan.FromSeconds(1));

 }
由于“SearchedUsers”表经常被其他用户/应用程序使用,因此在对该数据库进行查询时,我通常会遇到减速/死锁

我做了一些研究,通过关闭延迟加载、对query使用AsNoTracking()技巧以及在对DB执行查询时增加命令超时来加快这个过程,但是死锁有时仍然会发生

所以我的问题是:

  • 如何将此查询转换为编译查询
  • 与常规查询相比,在执行编译查询时,我能期望多大的性能

  • 有人能帮我实现编译后的查询解决方案一吗?

    在数据库中将查询创建为视图。在查询或隔离级别READ UNCOMMITTED上设置NOLOCK提示。然后将模型对象作为表设置到视图中

    编译查询将有助于提高性能,但它不会帮助您锁定记录


    还有,为什么要使用200毫秒的CommandTimeout?如果你调整它会发生什么?

    你在LastUpdatedAt上有索引吗?当您在该字段上排序时,它可能会加快查询速度。@johey是的,该字段上还有一个索引:)您使用的是什么数据库?当多个用户连接到数据库时,锁定在数据库中,而不是在网络库中。SQL Server确实会锁定,而oledb(access和excel的后端)不会锁定(即使文件处于共享模式)。@jdweng MSSQL 2016版本是使用的数据库。SQL确实会锁定,但您必须确保任何主键都是唯一分配的。重复的主键可能会导致问题。当您有多个用户时,您希望使用存储过程来分配主用户。请参阅:SQL Server是多任务操作数据库,并将查询拆分为多个进程。所以,您必须等待所有进程完成,这可能需要很长的时间。碎片化可以帮助您。在数据库使用多个服务器时,您也可能会被延迟。