我目前正在开发一个需要通过其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,它必须遍历。
这是进行“批量选择”的最佳效果吗?
答案 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.