任务:
我有一个数据库,有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}
所以我得检查一下
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内存,当大小增加时,我们可以搜索其他技术,比如临时写入数据库表等。
发布于 2016-02-16 17:31:14
“将内容.复制到程序的内存中是否可行?”
“可行”?当然,这种技术被称为缓存,我相信您已经听说过它。然而,你应该把一些想法投资在这样的事情上
它会比其他方法更快吗?没有其他好的方法,除了尝试和测量,它取决于一堆我们不知道的事情,也许有些事情,甚至你还不知道。考虑从较小的数据集开始并进行外推。
然而,发送1,20亿个单一查询看起来不太有希望,根据经验,“在内存中”做事情通常比在外部存储介质上执行“等效的事情”要快得多,在两者之间进行数据库管理。根据查询的类型,您可以尝试利用数据库的索引功能,这可能会改善这方面的情况。另一方面,如果在数据库中可以建立索引,那么在内存中也可以使用散列/字典。
在阅读了你的评论后,对我来说,存储结果就像是一个瓶颈。即使您可以在不到一秒钟的时间内从这五个表a中查询完整的数据,完全在内存中完成主处理,结果证明它比您提出的任何其他方法都要快,您最终需要创建这2.4亿行,这将需要一些时间。这里要考虑的是:
然而,不管是内存中还是内存中,它归结为特定的数据库,网络,硬件,任务的很多细节,以及你选择的实现,在这里没有任何东西可以在不知道“真实的东西”的情况下进行评估。
https://softwareengineering.stackexchange.com/questions/310239
复制相似问题