Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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 vs SQL筛选集合_C#_Asp.net_Linq - Fatal编程技术网

C# 使用LINQ vs SQL筛选集合

C# 使用LINQ vs SQL筛选集合,c#,asp.net,linq,C#,Asp.net,Linq,关于使用LINQ vs SQL过滤集合,我有一个非常普遍的问题。假设您正在数据库表上运行一个相当复杂的过滤器。它正在运行,比如说10000次,每次过滤器都可能不同。在性能方面,您最好将整个数据库表集合加载到内存中并使用LINQ执行过滤器,还是让数据库使用SQL处理过滤(因为这就是构建的目的)。有什么想法吗 编辑:我应该说得更清楚些。假设我们讨论的是一个包含1000条记录和20列(包含int/string/date数据)的表。目前在我的应用程序中,我每1/2小时运行一次查询,将所有数据拉入一个集合

关于使用LINQ vs SQL过滤集合,我有一个非常普遍的问题。假设您正在数据库表上运行一个相当复杂的过滤器。它正在运行,比如说10000次,每次过滤器都可能不同。在性能方面,您最好将整个数据库表集合加载到内存中并使用LINQ执行过滤器,还是让数据库使用SQL处理过滤(因为这就是构建的目的)。有什么想法吗

编辑:我应该说得更清楚些。假设我们讨论的是一个包含1000条记录和20列(包含int/string/date数据)的表。目前在我的应用程序中,我每1/2小时运行一次查询,将所有数据拉入一个集合(将该集合保存在应用程序缓存中),并在整个应用程序中过滤该缓存的集合。我想知道这是否比大量往返于数据库服务器(它是Oracle fwiw)更糟糕。

EDIT

它的大小取决于你拥有的数据量。如果您的数据量大于sql,如果小于linq,请使用sql。它还取决于从sql server调用数据的频率,它太频繁了,不适合在内存中加载,也不适合应用linq,但如果不是这样,sql就更好了

第一个答案

最好是在sql端,而不是在内存中加载和应用linq过滤器

使用sql比使用linq更好的一个原因是

如果去林克 当你获得10000条记录时,它会加载到内存中并增加网络流量

如果选择sql
没有记录会减少,因此使用的内存量会减少,也会减少网络流量。

取决于表的大小及其存储的数据类型

就个人而言,如果您计划在同一请求期间使用所有过滤器,我会返回所有数据


如果它是使用ajax的按需筛选,那么您可以每次从数据库重新加载数据(确保您的数据同时是最新的)

我会说,让SQL进行复杂的筛选和其他处理要好得多,但您可能会问为什么

主要原因是SQL Server具有您设置的索引信息,并使用此索引快速访问数据。如果您在Linq上加载它们,那么您就没有用于快速访问数据的索引信息,您就失去了访问它们的时间。而且每次编译linq都会浪费时间

你可以做一个简单的测试,看看自己有什么不同。什么测试?创建一个包含100个随机字符串的简单表,并使用该字符串索引此字段。然后对字符串字段进行搜索,一个使用linq,另一个直接询问sql

更新 我的第一个想法是,SQL保留索引,并基于SQL快速访问搜索数据库

然后我认为linq还可以将这个过滤器转换为sql,然后获取数据,然后您进行操作等等

现在我认为真正的原因在于你做了什么可以更快地直接运行SQL,但其原因取决于实际如何设置linq

如果您尝试在内存中加载所有数据,然后使用linq,那么您将失去SQL索引的速度,并失去内存,以及将数据从SQL移动到内存的大量操作


如果您使用linq获取数据,然后不需要进行其他搜索,那么您将丢失内存中所有数据的移动,并丢失内存。

这可能会引起关于数据库角色的一些争论!不久前我遇到了这个问题,一些比较复杂的过滤(比如“在X国家,价格是y,关键字是z”),速度非常慢。再加上这一点,我不允许更改数据库结构,因为它是第三方数据库


我调出了所有的逻辑,所以数据库只返回结果(我每小时缓存一次),并在内存中进行过滤——当我这样做时,我看到性能大幅提高。

t取决于您过滤的数据量

您说过滤器每次运行10K次,每次都可能不同,在这种情况下,如果数据库中没有太多数据,可以将其加载到服务器变量中

若数据库中有成千上万条不应该这样做的记录,那个么您可以在数据库和每个编译过程中创建索引,以更快地获取数据

您可以在两者之间实现cache facade,它可以帮助您在第一次请求时将数据存储在服务器端,并根据您的要求进行更新。(只有在数据有记录限制的情况下,才可以编写cache以填充变量)

您可以通过运行一些测试查询和观察来计算从数据库获取数据的时间。同时,如果数据存储在内存中,您可以观察服务器的响应时间,并计算差异并据此作出决定

有很多其他的技巧,但底线是

您必须观察并做出决定。

更新后:

它正在运行,比如说10000次

我假设一个表有1000条记录

假设1k记录很容易放入内存似乎是合理的

然后运行10k过滤器的内存(LINQ)会便宜得多。

使用SQL将意味着加载10万条记录和大量I/O。

我需要一些示例代码,以了解复杂性,真正为您提供一个有效的视角。每次都是同一个集合吗?我想您可以自己回答。使用Linq2Sql或Linq2EF,情况将是一样的。”我有一个非常普遍的问题“-不。这在很大程度上取决于实际数据的大小、过滤器的复杂性等。衡量一个非常具体的情况。我投票决定结束。目前没有提供足够的信息。假设一系列过滤器的结果大多>