Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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# 改进Linq查询_C#_.net_Database_Performance_Linq To Entities - Fatal编程技术网

C# 改进Linq查询

C# 改进Linq查询,c#,.net,database,performance,linq-to-entities,C#,.net,Database,Performance,Linq To Entities,我有以下疑问: if (idUO > 0) { query = query.Where(b => b.Product.Center.UO.Id == idUO); } else if (dependencyId > 0) { query = query.Where(b => b.DependencyId == dependencyId ); } else { var dependencyIds = dependencies.Select(d =&g

我有以下疑问:

if (idUO > 0)
{
    query = query.Where(b => b.Product.Center.UO.Id == idUO);
}
else if (dependencyId > 0)
{
    query = query.Where(b => b.DependencyId == dependencyId );
}
else
{
    var dependencyIds = dependencies.Select(d => d.Id).ToList();

    query = query.Where(b => dependencyIds.Contains(b.DependencyId.Value));
}

[...] <- Other filters...

if (specialDateId != 0)
{
    query = query.Where(b => b.SpecialDateId == specialDateId);
}

当我访问第一个
页面
时,可以,查询时间不到1秒,但当我尝试访问页面30000时,查询时间超过20秒。在linq查询中有一种方法可以提高查询的性能?还是仅在数据库级别?在数据库级别,对于这种查询,哪一种是提高性能的最佳方法?

在这里没有多少空间可以让事情变得更好(至少看一下提供的代码)

当您试图在这些数字上获得良好的性能时,我建议根本不要使用
LINQ
,或者在列表中使用它来访问smaler数据


您可以在这里做的是,在
数据库
级别引入该数据的分页,使用一些
存储过程
,并从
C#
代码调用它。

在这里没有太多空间,我想,让事情变得更好(至少看看提供的代码)

当您试图在这些数字上获得良好的性能时,我建议根本不要使用
LINQ
,或者在列表中使用它来访问smaler数据


在这里,您可以使用一些
存储过程在
数据库
级别引入该数据的分页,并从
C#
代码调用它。

1-在DB中创建一个视图,该视图按日期对项目进行排序,包括所有相关关系,如产品等


2-创建一个使用相关参数查询此视图的存储过程。

1-在DB中创建一个视图,该视图按日期对项目进行排序,包括所有相关关系,如产品等


2-创建一个使用相关参数查询此视图的存储过程。

我建议您启动SQL Server Profiler,并在运行查询(快速和慢速)时在服务器上运行配置文件。
完成此操作后,您可以将其拉入数据库引擎优化顾问,以获得有关应添加的索引的一些提示。。这在过去对我有很大的影响。当然,如果您知道需要什么索引,只需添加它们,而不必运行Advisor:)

我建议您启动SQL Server Profiler,并在运行查询(快速和慢速)时在服务器上运行配置文件。
完成此操作后,您可以将其拉入数据库引擎优化顾问,以获得有关应添加的索引的一些提示。。这在过去对我有很大的影响。当然,如果你知道你需要什么索引,你可以不运行Advisor直接添加它们:)

我想你会发现数据库出现了瓶颈。原因如下

询问

您有您的查询和条件。它通过一个非常难看但不太可怕的select语句进入数据库

.OrderBy(b=>b.Date)

现在,您正在按日期对这个巨大的记录集进行排序,这可能不是一个可怕的打击,因为它(希望)在该字段上建立了索引,但这确实意味着整个记录集将被带到内存中,并在任何跳过或获取发生之前进行排序

.跳过(20*页)。采取(20)

好的,这就是糟糕的数据库的艰难之处。对于大型记录集,Entity在这方面非常糟糕。我敢说,你可以打开sql分析器,查看它所发送的sql的随机混乱

当您开始跳过并获取时,实体通常会发送查询,强制数据库扫描整个巨型记录集,直到找到您要查找的内容。如果这是记录集中的第一个有序记录,比如说第1页,可能不会花太长时间。当您选择第30000页时,由于实体准备报表的方式,它可能正在扫描大量数据

我强烈建议您查看以下链接。我知道上面写的是2005年,但也适用于2008年

<>你一旦阅读了这个链接,你可能想考虑如何创建一个存储过程来完成你要做的事情。它将更加轻量级,具有缓存的执行计划,并且可以很好地保证为您更快地返回数据


除此之外,如果您想坚持使用LINQ,请继续阅读,并确保为只读操作设置MergeOption.NoTracking。您还应该尝试返回带有显式联接的对象查询,而不是带有延迟加载的IQueryable,尤其是在迭代结果并联接到其他表的情况下。延迟加载可能是一个真正的性能杀手。

我想您会发现瓶颈发生在数据库上。原因如下

询问

您有您的查询和条件。它通过一个非常难看但不太可怕的select语句进入数据库

.OrderBy(b=>b.Date)

现在,您正在按日期对这个巨大的记录集进行排序,这可能不是一个可怕的打击,因为它(希望)在该字段上建立了索引,但这确实意味着整个记录集将被带到内存中,并在任何跳过或获取发生之前进行排序

.跳过(20*页)。采取(20)

好的,这就是糟糕的数据库的艰难之处。对于大型记录集,Entity在这方面非常糟糕。我敢说,你可以打开sql分析器,查看它所发送的sql的随机混乱

当您开始跳过并获取时,实体通常会发送查询,强制数据库扫描整个巨型记录集,直到找到您要查找的内容。如果这是记录集中的第一个有序记录,比如说第1页,可能不会花太长时间。当您选择第30000页时,由于实体准备报表的方式,它可能正在扫描大量数据

我强烈建议您查看以下链接。我知道上面写的是2005年,但也适用于2008年

一旦你读了那个链接,你可能想考虑如何创建一个存储过程来完成什么

return query.OrderBy(b => b.Date).Skip(20 * page).Take(20).ToList(); // the returned object is a Ticket object, that has 23 properties, 5 of them are relationships (FKs) and i fill 3 of these relationships with lazy loading