Sql server SQL Server-加入isn';t使用实体框架中的最佳顺序';s生成的查询
我使用实体框架在我的数据库上执行一个相当复杂的查询。该查询由其他两个Sql server SQL Server-加入isn';t使用实体框架中的最佳顺序';s生成的查询,sql-server,performance,entity-framework,database-performance,Sql Server,Performance,Entity Framework,Database Performance,我使用实体框架在我的数据库上执行一个相当复杂的查询。该查询由其他两个IQueryables的.Union()组成 为了优化上述查询,我对不同的子查询进行了分解,并对它们分别进行了测试,以测量性能,发现其中一个(我们称之为joines)比其他查询慢得多 joinRes是两个(过滤的)表之间的连接,其中一个表有大量记录,而另一个表只有两条记录 var smallDataSet = RepositoryForSmallDataSet.Where(smDs => ... ); var joinR
IQueryables
的.Union()
组成
为了优化上述查询,我对不同的子查询进行了分解,并对它们分别进行了测试,以测量性能,发现其中一个(我们称之为joines
)比其他查询慢得多
joinRes
是两个(过滤的)表之间的连接,其中一个表有大量记录,而另一个表只有两条记录
var smallDataSet = RepositoryForSmallDataSet.Where(smDs => ... );
var joinRes = smallDataSet.Join(largeDataSet,
smDs => smDs.SomeID,
bigDs => bigDs.SomeID,
(smDs, bigDs) => bigDs)
.OrderByDescending(bigDs => bigDs.SomeDate);
// ... IQueryable joinRes will be used in some .Union() operations with other IQueryables into a largeQuery IQueryable...
var result = largeQuery.Take(10).ToList();
查看SQL Server中的实际执行计划,我可以看到joiners
子查询中的Nested Loops
步骤没有选择最佳顺序(smallDataSet
先选择largeDataSet
)。如果我在生成的SQL中添加一个选项(强制顺序)
提示,子查询会快得多
问题是,我似乎找不到通过实体框架添加提示的方法,而简单地将复杂查询(请记住,joinRes
是大型复杂查询的一部分)移动到存储过程将是一个很大的麻烦(这是一个高度动态生成的查询,可能需要大量动态SQL)
对如何解决这个问题有什么建议吗
编辑:
Evaldas Buinauskas的回答让我走上了正确的道路。以及由继承机制(本问题中未提及)引起的一系列其他连接。修复了索引(基于SQL Server的执行计划)和重构继承,改为使用一种方法。您的索引正确吗?因为
键查找
表示索引不包含联接条件,或者它输出的列不包括在索引中
建议消除它们(查找)。这是一个解释如何做
当对表进行索引查找时,会发生键查找,但
您的查询需要不在该索引中的其他列。
这导致SQL Server必须返回并检索这些额外的数据
列
似乎您应该更新这些表的统计信息。@AlexanderFedorenko,我确实尝试了
EXEC sp_updatestats
。以及重建索引。不走运。实际的查询是什么?为什么你认为顺序不是最优的?无论如何,EF/LINQ不能替代SQL。如果必须使用LINQ进行连接,则使用了错误的实体/关系。父实体与子实体之间应该存在关系。带有“数据集”一词的实体名称是一种非常强烈的气味。感谢您的输入,我将对此进行研究,然后返回给您。发现得很好。这不是唯一的原因,但你的投入是提高绩效的关键。谢谢