0

我的 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

需要一秒钟以上。(是的,在我们的例子中,一秒钟实际上太多了)。但这可以通过

  1. 移除order by(大约快两倍)
  2. 按升序排序(聚集索引是升序的,不能是其他的)
  3. 添加option(loop join)(非常快)
  4. 使用左外连接
  5. 添加Where FormTypeID = 1(主表中的鉴别器列,所有订单为 1)(快两倍)

实际上产生相同结果的唯一解决方案是 3 和 5,但是使用 Entity Framework 是不可能的(我们不能向查询添加提示)并且 5 不够快

非常感谢任何建议。

4

2 回答 2

3

您可以使用计划指南来获得您想要的行为。有关示例,请参阅在计划指南中使用查询提示。该示例需要实际的语句文本(EF 生成的 T-SQL),但您可以通过使用sp_create_plan_guide_from_handle.

在您的下一个项目中,避免将类表继承与每个实体派生自的基础Master对象一起使用...

于 2012-04-08T16:08:15.143 回答
1

如果要强制查询提示。我认为您最好的呼声是创建一个存储过程并使用查询提示(在此处查看更多信息)。或者也许你可以做这样的事情:

var items = dc.ExecuteQuery<ToSomeObject>("YourQueryWithHints").ToList();
于 2012-04-08T11:46:50.293 回答