Sql server SQL Server联合与SELECT TOP(x)优化

Sql server SQL Server联合与SELECT TOP(x)优化,sql-server,entity-framework,optimization,union,Sql Server,Entity Framework,Optimization,Union,我最近处理了一个调用,其中运行的查询(通过实体框架)超时。这是另一个开发人员编写的代码,该开发人员执行了以下操作 创建了一个由2个IQueryables组成的复杂集合,然后用一个联合体连接在一起: IQueryable<AwardListing> listData = null; listData = GetGoodsAwards(); listData = listData.Union(GetServicesAwards()); 最后,返回前100条记录,因为完整的记录集通常包含

我最近处理了一个调用,其中运行的查询(通过实体框架)超时。这是另一个开发人员编写的代码,该开发人员执行了以下操作

创建了一个由2个
IQueryable
s组成的复杂集合,然后用一个
联合体连接在一起:

IQueryable<AwardListing> listData = null;
listData = GetGoodsAwards();
listData = listData.Union(GetServicesAwards());
最后,返回前100条记录,因为完整的记录集通常包含太多的记录,无法传递给客户端:

 return listData.Take(100).ToList<AwardListing>();
返回listData.Take(100).ToList

我发现一件奇怪的事情是,当不选择前100条记录时,查询速度要快得多(如上所示)。右侧查询的执行计划显示延迟是由工会造成的:

我觉得这很奇怪,因为两个问题都有联合。唯一的区别是
TOP(100)
,但是我采取了步骤,通过从等式中删除并集来修复问题。为此,我将2个
IQueryable
s分开,对这两个应用过滤器,然后执行它们并在内存中将它们连接在一起。这大大缩短了最终用户搜索的总体执行时间

现在,我必须按照组织的要求填写不合规文件。我不太知道该说些什么:

防止未来不合格的行动


部分,因为我不完全确定问题的根本原因是什么。我不敢说:不要使用SQL Union,因为它本身似乎不是我问题的原因。

Union很好;虽然Linq的用法通常是。。。。有趣的但也许这可以帮助你了解一些事情:
 return listData.Take(100).ToList<AwardListing>();