0

我想创建一个外部应用程序,它将从大型 Oracle 数据库中查询一个表。

该查询将每天运行,我预计将处理 30,000 多行。

为了分解这些行的大小,我想为存在的每 10,000 行创建一个新线程/进程。因此,按照上图,处理所有这些行将是 3 个线程。

我不希望每个线程相互重叠行集,所以我知道我需要在表中添加一列作为范围标记,row_position

逻辑

Get row_count of data set in query parameters
Get first_row_pos

While (row_count > 10,000)
{
    Create thread with 10,000 rows starting from first_row_pos
    row_count == row_count - 10,000
    first_row_pos = first_row_pos + 10,000
}

create thread for remaining rows
all threads run their queries concurrently.

这是目前的基本逻辑,但是我不知道这是否可行。

这是一个好方法还是有更好的方法?

这可以通过每个线程共享的一个数据库连接来完成,还是每个线程都有一个单独的数据库连接更好?

欢迎任何其他建议?

注意:我刚刚意识到如果在这种情况下少于 10,000 行,do while 循环会更好。

谢谢

4

2 回答 2

1

Oralce 为诸如此类的情况提供了并行提示,当您遇到全表扫描或类似问题并希望使用多个内核来划分工作负载时。更多细节在这里

语法非常简单,您指定表(或别名)和核心数(我通常保留为默认值),例如:

select /*+ parallel(a, default) */ *
  from table_a a

您也可以将其与多个表一起使用,例如

select /*+ parallel(a, default) parallel(b,default) */ *
  from table_a a, table_b b
 where a.some_id = b.some_id
于 2013-09-04T13:31:28.667 回答
1

数据库连接不是线程安全的,因此如果要从多个线程查询数据库,则必须为每个线程建立单独的连接。您可以创建连接或从池中获取它们。

在您实施您的方法之前,请花一些时间来分析花费的时间在哪里。总体而言,Oracle 在利用多个内核方面非常出色。而数据库交互通常是最耗时的部分。通过将查询一分为三,您实际上可能会减慢速度。

如果您的应用程序确实花费大部分时间对该数据执行计算,那么您最好的方法可能是在单个线程中加载所有数据,然后将处理拆分为多个线程。

于 2013-09-04T13:50:10.657 回答