EF 包含的性能问题

本文关键字:问题 性能 包含 EF | 更新日期: 2023-09-27 18:37:16

>i我在一个项目中,我对数据库结构没有任何控制权。我已经从数据库创建了我的模型,下面的所有表都有外键。除了用户表之外,每个表中大约有 500k 到 1000k 行,而且它们相当宽。

使用 EF5 执行此查询需要两秒钟以上:

 var customerEngage = ctx.Customer_TB
                        .Include(c => c.Insurance_TB)
                        .Include(c => c.Insurance_TB.Select(i => i.H80Row_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.WinsureRow_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.User_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.User_TB.Department_TB))
                        .SingleOrDefault(c => c.IDCustomer == myID);

相关表中不一定有任何行。

我可以在没有任何性能问题的情况下进行此SQL查询:

SELECT * 
from dim.Customer_TB c
    INNER JOIN fact.insurance_tb i on i.IDCustomer = c.IDCustomer
    LEFT JOIN fact.H80Row_TB h80 on h80.IDInsurance = i.IDInsurance
    LEFT JOIN fact.WinsureRow_TB winsure on winsure.IDInsurance = i.IDInsurance
    LEFT JOIN eb.User_TB a on i.LockedByUserID = a.IDUser
    LEFT JOIN eb.Department_TB dept on dept.IDDepartment = a.IDDepartment
WHERE c.IDCustomer = myID

首先,我的 EF 查询是否做错了什么?我可以制作一个 SP,但是我将如何从该结果集中填充我的 POCOS?

EF 包含的性能问题

将 SingleOrDefault

更改为 Where - 您的 SingleOrDefault 不一样,它确保最多一行。

您还可以检查随 Sql 性能分析器发出的 sql 和/或var sql = ((System.Data.Objects.ObjectQuery)customerEngage).ToTraceString();

您不需要所有这些包含。

var customerEngage = ctx.Customer_TB
                        .SingleOrDefault(c => c.IDCustomer == myID);

应该做这项工作。