Ищете оптимизацию кода ниже - PullRequest
0 голосов
/ 06 апреля 2020

Я обнаружил ниже код ошибки, поскольку он ухудшает производительность сетки extjs3, я ищу возможности оптимизации на уровне запроса или кода, согласно моему анализу, если мы извлекаем запрос, есть два вложенных внутренних запроса, которые медленный ответ, кроме того, код внутри while loop пытается найти уникальный идентификатор, мы не можем иметь distinct в запросе или объединяем, а не внутренние запросы.

Пожалуйста, предложите мне лучшую практику для следуйте, чтобы добиться оптимизации.

public boolean isSCACreditOverviewGridVisible(String sessionId) {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        boolean result = false;
        try {
            CommonUtility commUtil = new CommonUtility();

            List<String> hmIds = new ArrayList<String>();
            Map<String, String> tmStockMap = new TreeMap<String, String>();
            Set<String> setRecentCertificate = new HashSet<String>();

            String managerAccountId = sessionInfo.getMembershipAccount();

            String stockQuery = " select memberId , RootCertficateId from stockposition sp  where sp.stocktype = 'TR' and sp.memberId "
                + " IN  ( select hm2.accountId from "
                DATALINK
                + ".holdingmembers  hm2 "
                + " where hm2.holdingId = ( select holdingId from "
                DATALINK
                + ".holdingmembers  hm1 where hm1.accountId =  ? )) "
                + " order by sp.createdDate desc ";

            conn = getChildDBConnection();
            if (null != conn) {
                ps = conn.prepareStatement(stockQuery);
                ps.setString(1, managerAccountId);
                rs = ps.executeQuery();
                if (null != rs) {
                    while (rs.next()) {
                        String memberId = rs.getString("memberId");
                        String rootCertficateId = rs
                        .getString("RootCertficateId");
                        if (tmStockMap.containsKey(rootCertficateId)) {
                            continue;
                        }
                        hmIds.add(memberId);
                        tmStockMap.put(rootCertficateId, memberId);
                    }
                }
                rs.close();
                ps.close();

                if (null != hmIds && !hmIds.isEmpty()) {
                    String inIds = commUtil.getInStateParam(hmIds);
                    String mostRecentLicense = "Select RootCertificateId , memberaccountid  from "
                        + OctopusSchema.octopusSchema
                        + ".certificate c where  c.memberaccountid IN ("
                        + inIds
                        + ") and c.isrootcertificate=0 and c.certificationstatusid > 1 order by c.modifieddate desc";
                    ps = conn.prepareStatement(mostRecentLicense);
                    rs = ps.executeQuery();
                    if (null != rs) {
                        while (rs.next()) {
                            String rootCertficateId = rs
                            .getString("RootCertificateId");
                            String memberaccountid = rs
                            .getString("memberaccountid");
                            if (setRecentCertificate.contains(memberaccountid)) {
                                continue;
                            }
                            setRecentCertificate.add(memberaccountid);
                            if (tmStockMap.containsKey(rootCertficateId)) {
                                result = true;
                                break;
                            }
                        }
                    }
                    rs.close();
                    ps.close();
                } else {
                    result = false;
                }
            }
        } catch (Exception e) {
            LOGGER.error(e);
        } finally {
            closeDBReferences(conn, ps, null, rs);
        }
        return result;
    }

ЗАПРОС:

 select RootCertficateId,memberId from stockposition sp  where sp.stocktype = 'TR' and sp.memberId 
                  IN  ( select hm2.accountId from 
                DATALINK.holdingmembers  hm2 
                    where hm2.holdingId = ( select holdingId from 
                DATALINK.holdingmembers  hm1 where hm1.accountId =  '4937' )) 
                    order by sp.createdDate DESC; 

enter image description here

enter image description here

1 Ответ

0 голосов
/ 06 апреля 2020

Один быстрый подход будет заменой вашего IN на EXISTS. Если ваши внутренние запросы возвращают много строк, это будет намного эффективнее. Это зависит от того, вернет ли ваш подзапрос много результатов.

SQL Производительность сервера против производительности

...