C# 实体框架DbContext筛选的count查询使用变量时速度非常慢
使用ADO.NET实体数据模型,我在下面针对一个包含1800条记录的表构造了两个查询,该表有30多个字段,产生了惊人的结果C# 实体框架DbContext筛选的count查询使用变量时速度非常慢,c#,entity-framework-6,query-optimization,C#,Entity Framework 6,Query Optimization,使用ADO.NET实体数据模型,我在下面针对一个包含1800条记录的表构造了两个查询,该表有30多个字段,产生了惊人的结果 // Executes slowly, over 6000 ms int count = context.viewCustomers.AsNoTracking() .Where(c => c.Cust_ID == _custID).Count(); // Executes instantly, under 20 ms int c
// Executes slowly, over 6000 ms
int count = context.viewCustomers.AsNoTracking()
.Where(c => c.Cust_ID == _custID).Count();
// Executes instantly, under 20 ms
int count = context.viewCustomers.AsNoTracking()
.Where(c => c.Cust_ID == 625).Count();
我从数据库日志中看到,Entity Framework提供的查询几乎相同,只是过滤器部分使用了一个参数。将此查询复制到SSMS中并在其中声明和设置此参数将导致一个近乎即时的查询,这样它就不会出现在数据库端
有没有人遇到过这种情况,可以解释发生了什么?我受第三方控件的摆布,该控件将此命令添加到查询中,试图限制返回的行数,必须获取计数。这用于多个查询,因此需要通用解决方案。不幸的是,它没有像广告中所说的那样工作,它似乎只会使查询花费5-10倍的时间,如果我只是将整个视图加载到内存中。然而,当没有使用过滤器时,它就像做梦一样工作
这些组件的使用包括源代码,所以我可以改变这种行为,但需要考虑哪些方法可以用来提供可重用的解决方案。
< P>您没有提及模型的设计细节,但是如果您只想基于条件来记录记录,然后,可以通过仅基于一列计算结果集来优化此操作。比如说, int count = context.viewCustomers.AsNoTracking().Where(c => c.Cust_ID == _custID).Count();
如果您的设计有10列,并且基于上述语句,假设返回了100条记录,那么针对每个记录,结果集包含10列不可用的数据
您可以通过仅计算基于单个列的结果集来优化此设置
int count = context.viewCustomers.AsNoTracking().Where(c => c.Cust_ID == _custID).Select(x=>new {x.column}).Count();
还可以使用其他优化方法,例如使用异步计数变量。我猜您的表在
Cust\u ID
列上没有Index
。也许你可以检查一下再确认一下。