我的EF模型中有TPT继承。哪里有一个“Master”抽象类型,其中有几种类型继承,包括“Order”。有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,但使用实体框架3是不可能的(我们无法向查询添加提示)而且5不够快
非常感谢任何建议。
答案 0 :(得分:3)
您可以使用plan guides获取所需的行为。有关示例,请参阅Using Query Hints in Plan Guides。该示例需要实际的语句文本(EF生成的T-SQL),但您可以避免使用sp_create_plan_guide_from_handle
来获取EF生成的语句。
在您的下一个项目中,请避免使用Class Table Inheritance与每个实体派生的基础Master
对象...
答案 1 :(得分:1)
如果要强制查询提示。我认为你最好的呼声是以太创建一个存储过程并使用查询提示(参见更多here)。或者也许你可以这样做:
var items = dc.ExecuteQuery<ToSomeObject>("YourQueryWithHints").ToList();