Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
C# 使用";选择TOP";由Linq Take()生成_C#_Sql Server_Linq - Fatal编程技术网

C# 使用";选择TOP";由Linq Take()生成

C# 使用";选择TOP";由Linq Take()生成,c#,sql-server,linq,C#,Sql Server,Linq,我在一个简单的linq查询中遇到性能问题: var query = ctx.Set<AdministrativeProfile>().OrderBy(x => x.User.Lastname).Skip(9000).Take(1); 此查询的运行时间约为15秒。 我读了一些关于SELECT TOP由于某种原因速度较慢的文章,但我无法找到解决问题的方法 这是执行计划 需要注意的几件事: 1) .Skip(n).Take(x)是由分页系统一般添加的,因此我可以在不破坏一般分页的情

我在一个简单的linq查询中遇到性能问题:

var query = ctx.Set<AdministrativeProfile>().OrderBy(x => x.User.Lastname).Skip(9000).Take(1);
此查询的运行时间约为15秒。 我读了一些关于
SELECT TOP
由于某种原因速度较慢的文章,但我无法找到解决问题的方法

这是执行计划 需要注意的几件事:

1)
.Skip(n).Take(x)
是由分页系统一般添加的,因此我可以在不破坏一般分页的情况下修改的唯一部分是:

ctx.Set<AdministrativeProfile>().OrderBy(x => x.User.Lastname)
ctx.Set().OrderBy(x=>x.User.Lastname)

2) 我找到了一些方法来修复SQL语句并使其快速运行(比如在子查询中使用
内部HASH JOIN
,或者添加一个额外的where子句来检查是否
[Join1].[row\u number]
),但由于它是由linq查询生成的,所以对我帮助不大

3) 当用一个小的数字跳过(x)
时,它会运行得更快。执行时间随着
x
的大小而增加

4) 我使用的表没有很多行。每个大约9000人


因此,基本上,我知道如何修复SQL,但我不知道如何更改linq查询以优化它。

您应该分析查询并查看瓶颈所在。但是,我已经处理了一个类似的问题,通过在排序所依据的属性中添加一个属性(在您的例子中是
[Lastname]
),应该可以缓解这种缓慢


基本上说:跳过的成员越多,执行的排序就越多:使用索引时,排序会更快。

您应该分析查询并查看瓶颈所在。但是,我已经处理了一个类似的问题,通过在排序所依据的属性中添加一个属性(在您的例子中是
[Lastname]
),应该可以缓解这种缓慢


基本上说:跳过的成员越多,执行的排序就越多:使用索引时,排序速度会更快。

“我找到了一些方法来修复SQL语句并使其快速”——那么为什么不将SQL放在存储过程中并调用它,而不是使用LINQ呢?LINQ/Hibernate/等都很好,直到它们不是。这就是为什么归根结底,SP中的直接SQL是最好的选择。您仍然可以使用实体框架或任何您正在使用的东西来调用SP。您可以发布您的SQL解决方案吗?当您想要操作查询,但仍然感觉您正在处理它时,您应该使用视图tables@dcp:因为我们有向linq查询以及分页系统添加过滤器/排序参数的通用方法。如果我们必须为每个查询编写一个存储过程,这将花费更多的时间。我可以为这个特定的查询执行此操作,但是如果我们遇到另一个具有相同问题的查询,我更愿意找到一种方法来修复它并在任何地方使用linq,而不是让一些查询使用linq,而其他查询使用SP。不过,感谢您的回答,如果无法修复此linq查询,我可能会这么做。@ViviKFF:您使用的是什么EF版本和SQL Server版本?这是一个相当简单的查询。。。出于好奇,我使用EF 6.1.3和MSSQL 2012制作了一个示例应用程序,我看到了完全不同的查询,它执行得非常快。“我找到了一些方法来修复SQL语句并使其快速”——那么为什么不将SQL放入存储过程并调用它而不是使用LINQ呢?LINQ/Hibernate/等都很好,直到它们不是。这就是为什么归根结底,SP中的直接SQL是最好的选择。您仍然可以使用实体框架或任何您正在使用的东西来调用SP。您可以发布您的SQL解决方案吗?当您想要操作查询,但仍然感觉您正在处理它时,您应该使用视图tables@dcp:因为我们有向linq查询以及分页系统添加过滤器/排序参数的通用方法。如果我们必须为每个查询编写一个存储过程,这将花费更多的时间。我可以为这个特定的查询执行此操作,但是如果我们遇到另一个具有相同问题的查询,我更愿意找到一种方法来修复它并在任何地方使用linq,而不是让一些查询使用linq,而其他查询使用SP。不过,感谢您的回答,如果无法修复此linq查询,我可能会这么做。@ViviKFF:您使用的是什么EF版本和SQL Server版本?这是一个相当简单的查询。。。出于好奇,我使用EF 6.1.3和MSSQL 2012制作了一个示例应用程序,我看到了完全不同的查询,它执行得非常快。
ctx.Set<AdministrativeProfile>().OrderBy(x => x.User.Lastname)