关于使用LINQ vs SQL过滤集合,我有一个非常笼统的问题。假设您在数据库表上运行了一个相当复杂的过滤器。它正在运行,比如10,000次,过滤器每次都可能不同。性能方面,您最好将整个数据库表集合加载到内存中并使用LINQ执行过滤器,还是应该让数据库使用SQL处理过滤(因为这是构建的内容)。有什么想法吗?
编辑:我应该更清楚。让我们假设我们正在谈论一个包含1000条记录和20列的表(包含int / string / date数据)。目前在我的应用程序中,我每半小时运行一次查询,将所有数据导入集合(将该集合保存在应用程序缓存中),并在整个应用程序中过滤该缓存集合。我想知道这是否比进行数据库服务器的大量往返更糟糕(它是Oracle fwiw)。
答案 0 :(得分:2)
修改强>
它的alwyas取决于您拥有的数据量。如果你有大量数据而不是sql,如果你的数据少于linq。它还取决于从sql server调用数据的频率,它比在内存中加载更好,而不是应用linq但是如果不是sql则更好。
第一个答案
最好继续sql而不是加载到内存中,而不是应用linq过滤器。
最好选择sql而不是linq
如果去linq 当你获得10,000记录时,它会加载到内存中并增加纽约流量
如果去sql 没有记录减少因此内存利用量减少,并且减少了网络流量。
答案 1 :(得分:2)
更新后:
它正在运行,比如10,000次和
我将假设一张包含1000条记录的表
假设1k记录很容易适合内存,这似乎是合理的。
然后运行10k过滤器将会更便宜(LINQ) 使用SQL意味着加载10M记录,大量I / O.
答案 2 :(得分:1)
取决于您的桌子有多大以及它存储的数据类型。
就个人而言,如果您计划在同一请求中使用所有过滤器,我会继续返回所有数据。
如果是使用ajax按需过滤,您可以每次从数据库重新加载数据(在数据保持同步的同时保险)
答案 3 :(得分:0)
我会说让SQL做复杂的过滤器和其余的处理要好得多,但为什么你会问。
主要原因是因为SQL Server具有您设置的索引信息并使用此索引非常快速地访问数据。如果您在Linq上加载它们,那么您没有这个索引信息来快速访问数据,并且您没有时间访问它们。你每次都要浪费时间编译linq。
你可以做一个简单的测试,看看你的自我与众不同。什么考试?创建一个包含数百个随机字符串的简单表,并使用字符串索引此字段。然后在字符串字段上搜索,一个使用linq,一个直接询问sql。
我的第一个想法是SQL保留索引并快速访问SQL上的搜索数据库。
然后我认为linq也可以将这个过滤器翻译成sql,然后获取数据,然后你做出你的动作......
现在我认为实际的原因取决于你采取的行动。 直接运行SQL ,更快,但其原因取决于您实际设置linq的方式。
如果你试图在内存中加载所有内容然后使用linq,那么你会因为SQL索引而失去速度,并且会丢失内存,并且会失去很多动作来将数据从sql移动到内存。
如果您使用linq获取数据,然后不需要进行其他搜索,那么您将失去所有内存数据的移动并丢失内存。
答案 4 :(得分:0)
这可能会引起一些关于数据库角色的争论!我有一个相对复杂的过滤(一些相对复杂的过滤(例如“在X国家,价格是y并且有关键字z)之类的东西,并且它非常慢。加上这个,我不被允许改变数据库结构,因为它是第三方数据库。
我换掉了所有的逻辑,所以数据库刚刚返回结果(我每小时缓存一次)并在内存中进行过滤 - 当我这样做时,我看到大量的性能提升。
答案 5 :(得分:-1)
t取决于您要过滤的数据量。
你说过滤器运行10K时间,并且每次都可以不同,在这种情况下,如果你在数据库中没有太多数据,你可以将其加载到服务器变量上。
如果您在数据库上有数十万条记录,则不应该这样做,也许您可以在数据库和每个编译过程上创建索引以更快地获取数据。
您可以在两者之间实现缓存外观,以帮助您在第一次请求时在服务器端存储数据并根据您的要求进行更新。 (只有在数据具有记录限制时,您才可以编写缓存来填充变量。)
您可以通过运行一些测试查询和观察来计算从数据库获取数据的时间。同时,如果数据存储在内存中,您可以观察服务器的响应时间,并计算差异并按此决定。
可能有许多其他技巧,但基线是
你必须观察并决定。