我的 EF 模型中有一个 TPT 继承。哪里有一个“主”抽象类型,几个类型从中继承,包括“订单”。有 1700000 个订单,但是 master 有更多的行对应于其他类型。
我们有一个奇怪的案例,其中选择 50 个订单比选择相同的 50 个订单要慢,但其中包括一些其他相关实体。它回溯到非常简单的查询所在的数据库
select top 50 * from SAM.Master m
join SAL.[Order] o on o.OrderMasterID = m.MasterID
order by MasterID desc
需要一秒钟以上。(是的,在我们的例子中,一秒钟实际上太多了)。但这可以通过
- 移除
order by
(大约快两倍) - 按升序排序(聚集索引是升序的,不能是其他的)
- 添加
option(loop join)
(非常快) - 使用左外连接
- 添加
Where FormTypeID = 1
(主表中的鉴别器列,所有订单为 1)(快两倍)
实际上产生相同结果的唯一解决方案是 3 和 5,但是使用 Entity Framework 是不可能的(我们不能向查询添加提示)并且 5 不够快
非常感谢任何建议。