我想创建一个外部应用程序,它将从一个大型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循环会更好。
由于
答案 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总体上相当不错。而数据库交互通常是最耗时的部分。通过将查询拆分为三个,实际上可能会减慢速度。
如果您的应用程序确实花费大部分时间对该数据执行计算,那么您最好的方法可能是将所有数据加载到单个线程中,然后将处理拆分为多个线程。