Oracle 11g |使用Ids数组选择最快的方法

时间:2017-09-26 11:11:39

标签: java multithreading oracle11g

我目前正在开发一个需要通过其ID提取数十万行的项目。 为此,我们使用多线程概念。代码用java编写。

我会在这个解释中添加一些伪代码,以便您可以更好地想象这个概念。仅供参考:这个概念很好,但选择是为了减慢我们的要求。

首先,选择所需行的所有ID并将其存储在List中。此列表用于为线程提供他们需要选择的行的ID。

这是启动提取行的线程的类:

@Override
public void run() {
    ResultSet rs = null;
    try {
        rs = processor.getDao().extractRows(processor.getIds().subList(startRow, lastRow));

        while(rs.next()) {
            // DO STUFF WITH THE ROWS
            processor.setMessagesProcessed(processor.getMessagesProcessed() + 1);       // Increase the amount of processed messages by 1
            processor.setRowsReserved(processor.getRowsReserved() - 1); 
        }           
    } catch (SQLException e) {
        log.error("Failed to execute extraction query!");
        log.error(e);
    } finally {
        try {
            rs.close();
        } catch (SQLException e) {
            log.error("Failed to close ResultSet");
            log.error(e);
        }
    }

    log.debug("Thread ended");
}

一旦线程启动,它将创建一个ids-list的子列表,其中包含  和已经给出的最终索引。

这是线程的run()方法

SELECT * FROM TABLE WHERE ID IN ('ID1', 'ID2', 'ID3', ..., ....)

通过将线程所包含的id列表放入sql“IN()”形式来构建查询。

简化的SQL如下所示:

pip uninstall ipywidgets widgetsnbextension

pip install ipywidgets

jupyter nbextension enable --py --sys-prefix widgetsnbextension

这个“IN()”是我所说的性能点。它可以容纳服务类中定义的每个线程的最大消息量。因此,在我们的示例中,它可能最多包含1000个String-id,它必须遍历。

这是进行“批量选择”的最佳效果吗?

1 个答案:

答案 0 :(得分:0)

在SELECT中使用IN子句会对性能产生影响,并且您只能在IN子句中使用最多1000个值。

相反,我会按照以下方式提出建议。

maxThreads=10
numberOfRecordsPerThread=5000

create threadArray as per required size. // ThreadPoolExecutor is recommended

select min(ID) as minValue, max(ID) as maxValue from TABLE;

String query="select column1, column2, ... from TABLE where ID > ? and ID =< ( ? )"

for(int i=0; i <= (maxValue-minValue/numberOfRecordsPerThread); i++ )
{
    query="select column1, column2, ... from TABLE where ID > minValue and ID =< ( minValue + numberOfRecordsPerThread)"
    exceute the query and store result in resultSet
    maxValue = maxValue + numberOfRecordsPerThread; // increment for next iteration
    start a thread with resultset if any-thread is available in threadArray
}

run()
{
    // Read the resultSet and do the stuff here.

}