问题 查询List 或数据库是否更快?


我最近有几种情况需要来自同一个表的不同数据。一个例子是我将遍历每个“交付驱动程序”并为他们要交付的每个客户生成可打印的PDF文件。

在这种情况下,我拉了所有客户并将它们存入

List<Customer> AllCustomersList = customers.GetAllCustomers();

当我通过交付驱动程序循环时,我会做这样的事情:

List<Customer> DeliveryCustomers = AllCustomersList.Where(a => a.DeliveryDriverID == DriverID);

我的问题:通过查询List对象比每次查询与传递驱动程序相关的客户记录每次查询数据库更快,我是这样做的吗?


12043
2018-05-06 00:37


起源

我无法想象一种方法,从数据库中提取数据会比在内存中做的更好,就像你现在正在做的那样...我唯一能想到的就是确保你没有提取更多数据然后你会去使用... - Jared
查询列表应该快得多,因为它将存储在内存中。 - xbonez
在什么时候它会成为太多的数据放入列表并需要使用数据库? - Ricketts
@xbonez。事实并非如此。 DB是为过滤而构建的,使用大量数据,您使用的是DB,而不是内存。 - gdoron
@xbonez - 虽然您适合使用较小的数据集,但对于非常大的数据集(可能是10或数千,可能是数百万,甚至更多),数据库变得更有效,主要是因为索引和数据集的组织。记忆。当然,如果数据库可以将整个数据集保存在内存中,那么它将比在磁盘上更有效。 - codekaizen


答案:


没有准确的行数,如果你传递它,你应该在内存中查询数据库 List<T>

但经验法则是,DB设计用于处理大量数据,并且它们具有优化“机制”,而在内存中则没有这样的东西。

因此,您需要对其进行基准测试,以确定对于该行数量而言,DB的往返是否值得 每次对你来说都很重要

“我们应该忘记效率低,大约97%的时间说: 过早 优化是万恶之源


11
2018-05-06 00:52



谢谢!这句话让我重新考虑我的方法! +1 - Guillermo Gutiérrez


避免往返DB的往返是有关数据库性能调整的主要规则之一,尤其是当数据库位于网络上并且有多个用户访问它时。

从另一个角度来看,将大型结果集带入内存,就像您的客户数据看起来一样,效率并不高于在需要时前往数据库。

很好地利用内存集合来避免往返是针对您的查找表(即客户类别,客户区域等),这些表格不会经常更改。这样您就可以避免在主要客户选择查询中加入,从而加快查询速度。


1
2018-05-06 04:26





为什么不用 Redis的 ? ,它是一个内存数据库,速度非常快。


0
2017-10-28 07:36