基本上,我有一个循环(在Java中),该循环从表中查找每个id并对其执行一些操作。在每个循环中,它与数据库交互几次。它的执行速度比我想要的慢,因此我记录了与数据库的每次交互。我发现下面的这个sql比其他sql花费更多的时间。
select id from (select id,rownum as rn from person_info) where rn=#{rowNum}
这是循环的开始,在执行其他操作之前,我需要先获取ID。我在这里使用rownum是因为我想一次读取一行。供您参考,我一次只做一行,因为它涉及几个表,每个表都有数十亿行,如果我加入它们或运行复杂的sql,则需要花费很多时间。最重要的是,我需要使sql尽可能简单。
但是,此行比其他sql执行花费的时间更长。我认为这是由于rownum的性质,因为它查找整个表。是否可以优化此sql甚至不使用rownum?
id
是主键。如果您需要更多信息,请询问!
编辑:这是代码
for(int i = 1; i<=count; i++){
long startTime=System.currentTimeMillis();
String pid = ns.findPId(i); //find one pid at a time, average execution time ~130ms
//sql: select id from (select id,rownum as rn from person_info) where rn=#{rowNum}
long endTime=System.currentTimeMillis();
log.info("findPId(i): "+(endTime - startTime)+"ms");
startTime=System.currentTimeMillis();
Genotype g = ns.findPersonInfo(pid); //obtain associated info, average execution time ~20ms
endTime=System.currentTimeMillis();
log.info("findPersonInfo(pid): "+(endTime - startTime)+"ms");
if(g!=null){
if(g.getIdCardNumber()!=null && g.getIdCardNumber().matches(idCardNoEL)){ //valid card number
startTime=System.currentTimeMillis();
int isMatch = findPersonIdNoMatch(pid); //average execution time ~2ms
endTime=System.currentTimeMillis();
log.info("findPersonIdNoMatch(pid): "+(endTime - startTime)+"ms");
if(isMatch == 0){
startTime=System.currentTimeMillis();
String sampleId = ns.findSampleIdByPid(pid); //average execution ~10ms
endTime=System.currentTimeMillis();
log.info("findSampleIdByPid(pid): "+(endTime - startTime)+"ms");
if(sampleId!=null){
startTime=System.currentTimeMillis();
Genotype temp = ns.findGeneInfoBySampleId(sampleId); //get geneinfo and createDateTime, average execution ~10ms
endTime=System.currentTimeMillis();
log.info("findGeneInfoBySampleId(sampleId): "+(endTime - startTime)+"ms");
if(temp!=null){
startTime=System.currentTimeMillis();
g.setGeneInfo(temp.getGeneInfo());
g.setCreateDateTime(temp.getCreateDateTime());
endTime=System.currentTimeMillis();
log.info("set: "+(endTime - startTime)+"ms");
startTime=System.currentTimeMillis();
insertGenotype(g); //average execution 1ms
endTime=System.currentTimeMillis();
log.info("insertGenotype(g): "+(endTime - startTime)+"ms");
}
}
}else{
//log
}
}
}
答案 0 :(得分:0)
您可能希望运行简单的查询,例如
select id,rownum as rn from person_info
然后从您的Java代码对其进行迭代。不要一次获得所有结果,而是一次获取一行。 您可以在这里找到更多信息:https://dzone.com/articles/the-performance-difference-between-sql-row-by-row