首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果多个查询需要时间,那么将数据库的内容复制到程序的内存中是否可行?

如果多个查询需要时间,那么将数据库的内容复制到程序的内存中是否可行?
EN

Software Engineering用户
提问于 2016-02-16 16:27:31
回答 1查看 294关注 0票数 1

任务:

我有一个数据库,有4个表,分别有200行、800行、50行和30行。

为了简化它,让我们假设表是这样的集合:

A = AR1,AR2,AR3,B= BR1,BR2,C= CR1,Cr2,CR3,D= DR1,DR2,DR3,DR4,其中Ar1是表A中的row1。

还有一个包含250行的表"E“,其中包含一些与表A、B、C和D相关的信息。

对于AB,ABC和ABCD的每一个组合,我都需要检查E的所有行,看看是否有一些与组合相关的信息,并存储相关信息的计数。计数将最终写入SQL表中。

AB的组合是:

{Ar1,Br1},{Ar1,Br2},{Ar2,Br1},{Ar2,Br2},{Ar3,Br1},{Ar3,Br2}

所以我得检查一下

代码语言:javascript
复制
forAllRowsOfE
{    
if (row 1 of E == content of Ar1 and row1 of E <= content of Br1) then {var Ar1Br1++;}
}

并对A和B的所有其他组合运行上述for循环,然后也对ABC的组合运行它(对于这些组合,它将是{Ar1,Br1,Cr1},{Ar2,Br1,Cr1}...and等等)。以及ABCD的组合)。

尺寸:

A、B、C和D表本身的组合总数高达200*800*50*30 =2.4亿。

问题是:

运行2.4亿*5查询,即使每次查询需要0.01s,执行时间也要138天。桌子现在很小。我希望它们会长得更大。

我被建议将这些表加载到Java程序的内存中,并使用Java进行计算,因为AB的许多计数组合将在ABC的组合中重复,这样就可以避免大量的蛮力计数。另一个原因是,所有这些数据实际上可能适合6GB内存,当大小增加时,我们可以搜索其他技术,比如临时写入数据库表等。

问题:

  • 但是这里的主要问题是,在Java内存中执行这样的操作真的更可行/更快吗?
  • 嵌套循环的使用真的是解决这一问题的更好方法吗?还是还有其他技术/查询?
EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-02-16 17:31:14

“将内容.复制到程序的内存中是否可行?”

“可行”?当然,这种技术被称为缓存,我相信您已经听说过它。然而,你应该把一些想法投资在这样的事情上

  • 内存是否完全可用,在生产环境中,仅供您的程序使用?
  • 如你所说,当桌子的尺寸增加时会发生什么?例如,您能有效地将数据分割成可以同时在内存中处理的部分吗?

它会比其他方法更快吗?没有其他好的方法,除了尝试和测量,它取决于一堆我们不知道的事情,也许有些事情,甚至你还不知道。考虑从较小的数据集开始并进行外推。

然而,发送1,20亿个单一查询看起来不太有希望,根据经验,“在内存中”做事情通常比在外部存储介质上执行“等效的事情”要快得多,在两者之间进行数据库管理。根据查询的类型,您可以尝试利用数据库的索引功能,这可能会改善这方面的情况。另一方面,如果在数据库中可以建立索引,那么在内存中也可以使用散列/字典。

在阅读了你的评论后,对我来说,存储结果就像是一个瓶颈。即使您可以在不到一秒钟的时间内从这五个表a中查询完整的数据,完全在内存中完成主处理,结果证明它比您提出的任何其他方法都要快,您最终需要创建这2.4亿行,这将需要一些时间。这里要考虑的是:

  • 当您执行“内存中”的操作时,这是否意味着您必须通过(可能比较慢的)网络将数据发送回数据库服务器?还是使用类似于本地数据库的东西,其中程序+ db驻留在同一台机器上?
  • 假设网络流量成为一个问题:如何使用存储过程来减少网络流量?如何在表A、B、C、D、E上使用一个带有一些聚合函数的大型连接?你试过这个有多好吗?
  • 当处理不是内存中的处理时,这是否意味着您需要240 mio插入操作,然后是240 mio *n更新操作?可能会变慢。
  • 还是内存中的预处理允许您首先找到结果,然后使用某种批量插入机制将其“一次性”传输回数据库?

然而,不管是内存中还是内存中,它归结为特定的数据库,网络,硬件,任务的很多细节,以及你选择的实现,在这里没有任何东西可以在不知道“真实的东西”的情况下进行评估。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/310239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档