【发布时间】:2020-02-07 17:08:25
【问题描述】:
使用 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 count = context.viewCustomers.AsNoTracking()
.Where(c => c.Cust_ID == 625).Count();
我从数据库日志中看到,Entity Framework 提供的查询几乎相同,只是过滤器部分使用了一个参数。将此查询复制到 SSMS 并在其中声明和设置此参数会导致近乎即时的查询,因此它似乎不在数据库端。
有没有人遇到过可以解释发生了什么的情况?我受制于第三方控件,该控件将此命令添加到查询中以尝试限制返回的行数,因此必须获得计数。这用于多个查询,因此需要通用解决方案。不幸的是,它并没有像宣传的那样工作,它似乎只使查询花费的时间是我将整个视图加载到内存中的 5-10 倍。然而,当不使用过滤器时,它就像做梦一样。
这些组件的使用包括源代码,因此我可以更改此行为,但需要考虑可以使用哪些方法来提供可重用的解决方案。
【问题讨论】:
-
我猜你的表在
Cust_ID列上没有Index。也许您可以检查并再次确认。
标签: c# entity-framework-6 query-optimization