Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server中的一对一联接速度不够快_Sql Server_Performance_Entity Framework - Fatal编程技术网

Sql server SQL Server中的一对一联接速度不够快

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

我的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
需要一秒钟多的时间。(是的,在我们的例子中,一秒钟实际上太多了)。但这可以通过以下两种方式加快

  • 按删除订单(大约快两倍)
  • 按升序排序(聚集索引按升序排序,不能以其他方式排序)
  • 添加
    选项(循环连接)
    (非常快)
  • 使用左外联接
  • 添加
    ,其中FormTypeID=1
    (主表中的鉴别器列对于所有订单都是1)(快两倍)
  • 实际上,产生相同结果的唯一解决方案是3和5,但是3不可能使用实体框架(我们不能向查询添加提示),5不够快


    非常感谢您的建议。

    如果您想强制执行查询提示。我认为最好的方法是创建一个存储过程并使用查询提示(请参阅更多)。或者你可以这样做:

    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(在那里我可以扩展代码来做我想做的事)。