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-加入isn';t使用实体框架中的最佳顺序';s生成的查询_Sql Server_Performance_Entity Framework_Database Performance - Fatal编程技术网

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进行连接,则使用了错误的实体/关系。父实体与子实体之间应该存在关系。带有“数据集”一词的实体名称是一种非常强烈的气味。感谢您的输入,我将对此进行研究,然后返回给您。发现得很好。这不是唯一的原因,但你的投入是提高绩效的关键。谢谢