将大量行分解为较小的查询?排比

时间:2013-09-04 13:23:13

标签: sql multithreading oracle querying

我想创建一个外部应用程序,它将从一个大型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行,则while循环会更好。

由于

2 个答案:

答案 0 :(得分:1)

Oralce提供了一个并行提示,例如这种情况,您可以进行全表扫描或类似问题,并希望利用多个内核来划分工作负载。更多详情here

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

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

答案 1 :(得分:1)

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

在实施方法之前,请花点时间分析花费的时间。使用多核时,Oracle总体上相当不错。而数据库交互通常是最耗时的部分。通过将查询拆分为三个,实际上可能会减慢速度。

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

相关问题