Можно ли читать идентификаторы по одному без использования rownum?(оптимизация оракула) - PullRequest
0 голосов
/ 18 февраля 2019

По сути, у меня есть цикл (в Java), который ищет каждый идентификатор из таблицы и делает с ним несколько вещей.В каждом цикле он взаимодействует с базой данных несколько раз.Он работал медленнее, чем я хотел, поэтому я регистрировал каждое взаимодействие с БД.Я обнаружил, что этот sql внизу занял гораздо больше времени, чем другие sqls.

select id from (select id,rownum as rn from person_info) where rn=#{rowNum}

Это начало цикла, в котором мне нужно сначала получить id, прежде чем делать другие вещи.Я здесь использую rownum, потому что хочу читать по одной строке за раз.К вашему сведению, я делаю по одной строке за раз, потому что она включает несколько таблиц, каждая из которых содержит миллиарды строк, и это занимает вечность, если я присоединяюсь к ним или запускаю сложные sqls.Суть в том, что мне нужно, чтобы SQL был максимально простым.

Эта строка, однако, выполняется намного дольше, чем другие sqls.Я думаю, что это связано с характером 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
                }
            }
        }

1 Ответ

0 голосов
/ 18 февраля 2019

вы можете предпочесть выполнить простой запрос, такой как

select id,rownum as rn from person_info

и повторить его из своего кода Java.Не получайте все результаты сразу, а по одной строке за раз.Вы найдете больше информации здесь: https://dzone.com/articles/the-performance-difference-between-sql-row-by-row

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...