2017-01-28 71 views
1

我正在使用java中的多线程读取vertica数据库中的数据。 我有大约20万条记录,我打开5个不同的线程有这样的选择查询....通过java中的多线程从数据库中读取

start = threadnum; 

while (start*20000<=totalRecords){ 

    select * from tableName order by colname limit 20000 offset start*20000. 

    start +=5; 

} 

上述查询分配20K重复的记录从数据库到每个线程读取。 例如第一个线程会先读取20k个记录,然后从100 000个位置开始读取20K个记录等

但是我没有得到性能改进。事实上,如果使用单个线程需要x秒来读取2000万条记录,那么每个线程从数据库读取需要几乎x秒的时间。 x秒(x/5秒)不应该有所改善吗?

任何人都可以指出哪里出了问题?

+0

遵循这个逻辑,你只需要用''n''来增加线程数,以减少总处理时间''1/n''。 – Matt

+0

网络不是多线程的。你可以使用尽可能多的线程,但一旦你使网络饱和,就是这样,没有进一步的改进可能。 – EJP

回答

0

不,你不应该得到x/5秒。你没有想到你在相同的时间内获得了5倍的记录数量这一事实。这是关于吞吐量,而不是时间。

2

除了你理解什么情况可以通过多线程改善以及什么情况可能没有改善之外,没有什么问题了。

您的数据库可能位于磁盘上;这是一个磁盘与一组磁头一起移动,所以它就像是说它是一个单磁头磁盘一样。头部需要时间从一个位置移动到另一个位置;这叫做寻找时间

当您从一个线程读取顺序数据时,头部必须在轨道之间移动很少。

当你从多个线程读取不同的顺序数据流时,头部必须移动很多才能从一个轨道跳到另一个很远的轨道,然后返回到第一个轨道。这是很大的寻求开销。

然后,当然你的硬盘通过一根电缆连接到你的主板上,所以所有的数据(在所有的搜索开销之后)必须通过它才能被不同的线程处理。

结果当然是非常糟糕的表现。

带回家的教训是这样的:在同一个设备

大规模的I/O永远不能凭借多线程得到改善。

用不同的术语来说:处理数据时的并行性决不会在所有数据来自单个连续源时提高性能。

如果您有5个不同的数据库存储在5个不同的磁盘上,那会更好。 (如果您还将这些磁盘连接到主板上的5个独立IDE控制器,那么效果会更好。)

0

我就不重复了迈克Nakis说,因为它是真实的,很好的解释:

I /从一个物理磁盘Ø无法通过多线程

改善尽管如此,我想添点什么。从客户端

select * from tableName order by colname limit 20000 offset start*20000. 

你可以处理,你可以通过使用多线程提高了查询的结果:

当你执行一个查询这样。

但是从数据库方面来说,您还没有掌握查询的处理过程,并且Vertica数据库可能旨在通过根据机器可能性执行并行任务来执行您的查询。

所以从客户端你可以在一个,两个或三个并行线程中拆分你的查询的执行,最终它不应该改变很多事情,因为专业数据库被设计为根据数量优化响应时间要求它接收和机器的可能性。