Sql server SQL Server中的一对一联接速度不够快
我的EF模型中有一个TPT继承。其中有一个“Master”抽象类型,有几个类型从中继承,包括“Order”。有1700000个订单,但master有更多对应于其他类型的行 我们遇到了一个奇怪的情况,选择50个订单比选择同样的50个订单慢,但还包括一些其他相关实体。它可以追溯到数据库中非常简单的查询Sql server SQL Server中的一对一联接速度不够快,sql-server,performance,entity-framework,Sql Server,Performance,Entity Framework,我的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 Maste
select top 50 * from SAM.Master m
join SAL.[Order] o on o.OrderMasterID = m.MasterID
order by MasterID desc
需要一秒钟多的时间。(是的,在我们的例子中,一秒钟实际上太多了)。但这可以通过以下两种方式加快
选项(循环连接)
(非常快),其中FormTypeID=1
(主表中的鉴别器列对于所有订单都是1)(快两倍)非常感谢您的建议。如果您想强制执行查询提示。我认为最好的方法是创建一个存储过程并使用查询提示(请参阅更多)。或者你可以这样做:
var items = dc.ExecuteQuery<ToSomeObject>("YourQueryWithHints").ToList();
var items=dc.ExecuteQuery(“YourQueryWithHits”).ToList();
如果要强制执行查询提示。我认为最好的方法是创建一个存储过程并使用查询提示(请参阅更多)。或者你可以这样做:
var items = dc.ExecuteQuery<ToSomeObject>("YourQueryWithHints").ToList();
var items=dc.ExecuteQuery(“YourQueryWithHits”).ToList();
您可以使用来获得所需的行为。有关示例,请参见。该示例需要实际的语句文本(EF生成的T-SQL),但您可以通过使用来避免获取EF生成的语句
在下一个项目中,避免使用每个实体派生自的基本主对象。您可以使用它来获得所需的行为。有关示例,请参见。该示例需要实际的语句文本(EF生成的T-SQL),但您可以通过使用来避免获取EF生成的语句
在您的下一个项目中,避免使用每个实体派生自的基本主对象…您的问题是什么?如何提高查询执行速度?您比我们任何人都能更好地回答您自己的问题。我们只是在胡乱猜测。谢谢,但我真的需要这种类型的查询(在我的系统中经常发生)执行得非常快。3如果将其包装到存储过程并调用它,就可以实现。但是,您需要Master和Order的每一列吗?这样,您的索引只会起到很大的作用,因为您仍然可以进行RID查找。您的问题是什么?如何提高查询执行速度?您比我们任何人都能更好地回答自己的问题。我们只是在胡乱猜测。谢谢,但我真的需要这种类型的查询(在我的系统中经常发生)执行得非常快。3如果将其包装到存储过程并调用它,就可以实现。但是,您需要Master和Order的每一列吗?这样,你的索引只会有很大帮助,因为你仍然得到了一个RID查找表,但是不幸的是,这是一个大系统的一部分,它有很多特性,使用LINQ到实体,并且使用存储过程将阻塞大多数特征。然后,你可以考虑使用<代码> ExcExtQueQue>代码>作为其中的一部分。因为您不能仅在Linq.thanks中查询提示,但不幸的是,这是一个大型系统的一部分,它具有许多特性,使用LINQ到实体,并且使用存储过程将阻塞大多数特征。然后,您可以考虑使用<代码> ExcExtQueQue>代码>作为其中的一部分。因为你不能只在Linq中查询提示。谢谢,我明天会阅读并尝试使用你的建议。顺便说一句,我们并不是从Master继承一切,只是在特定过程中遇到的表单的Master。这也发生在细节上,我们有一套非常有趣的工具,可以处理Master和Detail,而不管它们的具体类型如何。如果为了避免性能上可能出现的问题,我们想放弃继承的所有好处,我可能宁愿做一些非常激进的事情,比如使用对象数据库,或者至少改用nhibernate(在那里我可以扩展代码来做我想做的事)。谢谢,明天我会阅读并尝试使用你的建议。顺便说一句,我们并不是从Master继承一切,只是在特定过程中遇到的表单的Master。这也发生在细节上,我们有一套非常有趣的工具,可以处理Master和Detail,而不管它们的具体类型如何。如果为了避免可能出现的性能问题,我们想放弃继承的所有好处,我可能会做一些非常激进的事情,比如使用对象数据库,或者至少更改为nhibernate(在那里我可以扩展代码来做我想做的事)。