我有这样的查询:
select samplePackage.prepareMessage(t.message) as text
from
sampleSchema.sampleTable t;
sampleTable有大数据(行数30M) prepareMessage是一个java存储过程。
private static String prepareMessage(String message) {
//do some things...
return preparedMessage;
}
我正在尝试并行执行此查询。我该怎么办?
感谢。
答案 0 :(得分:3)
我自己从未尝试过Java功能。但这种方法应该如下:
使用PARALLEL提示运行查询:
select /*+ PARALLEL(t) */ samplePackage.prepareMessage(t.message) as text
from sampleSchema.sampleTable t;
要成功并行执行SELECT,Oracle需要知道您的Java函数是安全的。因此,您必须将其声明为PARALLEL_ENABLE或提供RESTRICT_REFERENCES。
CREATE OR REPLACE FUNCTION PREPARE_MESSAGE(message IN VARCHAR2) RETURN VARCHAR2 PARALLEL_ENABLE
AS LANGUAGE JAVA
NAME 'sampleSchema.samplePackage.prepareMessage(Java.lang.String) return Java.lang.String';
然后查询变为:
select /*+ PARALLEL(t) */ PREPARE_MESSAGE(t.message) as text
from sampleSchema.sampleTable t;
还有一些适用于该功能的限制,例如:它可能不会执行DML语句。否则,无法并行执行。
正如我所说:我没有尝试过Java。但那是方向。
更新:我已将代码从使用包更改为使用函数。它应该更简单。
答案 1 :(得分:2)
使用Oracle的预先打包的API之一DBMS_JOB包将多个作业提交到作业队列,然后并行运行它们。
答案 2 :(得分:0)
为什么要并行执行?你打算怎么处理结果?
我认为并行运行它的唯一想法是在一个线程中执行它,然后数据库服务器将返回ResultSet
。此ResultSet
可以是将检索部分数据库响应的线程的参数(例如,每个线程将读取1M行)。