使用LINQ与SQL进行筛选集合
本文关键字:筛选 集合 SQL LINQ 使用 | 更新日期: 2023-09-27 18:28:43
关于使用LINQ与SQL过滤集合,我有一个非常普遍的问题。假设您正在数据库表上运行一个相当复杂的筛选器。它运行了10000次,每次的过滤器都可能不同。从性能角度来看,是将整个数据库表集合加载到内存中并使用LINQ执行过滤器更好,还是应该让数据库使用SQL处理过滤(因为这就是构建的目的)。有什么想法吗?
编辑:我本应该更清楚的。假设我们讨论的是一个包含1000条记录和20列(包含int/string/date数据)的表。目前,在我的应用程序中,我每半小时运行一次查询,将所有数据拉入一个集合(将该集合保存在应用程序缓存中),并在整个应用程序中过滤缓存的集合。我想知道这是否比往返数据库服务器(它是Oraclefwiw)还要糟糕。
更新后:
它正在运行,比如说10000次和
我假设一张有1000条记录的表
假设1k条记录很容易存储在内存中似乎是合理的。
然后运行10k过滤器将在内存(LINQ)中便宜得多
使用SQL意味着要加载10M条记录,大量I/O。
编辑
它总是取决于你拥有的数据量。如果您有大量的数据,请使用sql,如果少于,请使用linq。它还取决于从sql服务器调用数据的频率——它太频繁了,比在内存中加载和应用linq要好,但如果不是,则比sql好。
第一个答案
与其在内存中加载和应用linq过滤器,不如在sql端执行。
选择sql而不是linq的一个原因是
如果去林克当你得到10000条记录时,它会加载到内存中,并增加新的流量
如果使用sql记录数量减少,因此内存使用量减少,同时也减少了网络流量。
取决于表的大小及其存储的数据类型。
就我个人而言,如果您计划在同一请求中使用所有过滤器,我会返回所有数据。
如果是使用ajax的按需过滤器,您可以每次从数据库中重新加载数据(确保数据是最新的)
这可能会引起一些关于数据库角色的争论!不久前,我遇到了这个确切的问题,一些相对复杂的过滤(比如"在X国家,那里的价格是y,关键字是z),速度慢得可怕。再加上这一点,我不被允许更改数据库结构,因为它是第三方数据库。
我交换了所有的逻辑,所以数据库只返回结果(我每小时缓存一次),并在内存中进行过滤——当我这样做时,我看到性能大幅提高。
我会说让SQL来做复杂的过滤和其他处理要好得多,但为什么你可能会问。
主要原因是SQL Server拥有您设置的索引信息,并使用此索引快速访问数据。如果你在Linq上加载它们,那么你就没有快速访问数据的索引信息,而且你会浪费时间访问它们。而且每次编译linq都会浪费时间。
你可以做一个简单的测试,自己看看这有什么不同。什么测试?用一百个随机字符串创建一个简单的表,并用该字符串对该字段进行索引。然后在字符串字段上进行搜索,一个使用linq,另一个直接询问sql。
更新
我的第一个想法是SQL保留索引,并在SQL上快速访问搜索数据库。
然后我认为linq也可以将这个过滤器转换为sql,然后获取数据,然后你就可以进行操作等等
现在我认为实际的原因取决于你做了什么操作。直接运行SQL更快,,但原因取决于如何实际设置linq。
如果你试图在内存中加载所有数据,然后使用linq,那么你就失去了SQL索引的速度,失去了内存,也失去了将数据从SQL移动到内存的大量操作。
如果你使用linq获取数据,然后不需要进行其他搜索,那么你就失去了内存中所有数据的移动,也失去了内存。
t取决于您过滤的数据量。
您说过滤器运行10K次,每次都可能不同,在这种情况下,如果数据库中没有太多数据,您可以将其加载到服务器变量中。
若数据库中有几十万条不应该这样做的记录,也许可以在数据库中创建索引,并按照编译过程更快地获取数据。
您可以在两者之间实现缓存facade,帮助您在第一次请求时将数据存储在服务器端,并根据您的需求进行更新。(只有当数据有记录限制时,才能写入缓存以填充变量)。
您可以通过运行一些测试查询和观察来计算从数据库中获取数据的时间。同时,如果数据存储在内存中,您可以观察服务器的响应时间,并计算差异并据此做出决定。
还有很多其他技巧,但底线是
你必须观察并做出决定。