2013-09-06 2 views
0

Я нахожусь в центре войны с выбором, который атакует вид (действительно большой вид). моя проблема в том, что я хочу уменьшить время ответа, потому что я могу пойти в туалет, вернуться и сделать бутерброд. Надеюсь, извиняюсь за мое плохое чувство юмора. Так что это знаменитый выбор:оптимизировать выделение create с помощью jdbcTemplate

if (periodeDeute != null && clauDeute != null) { 
      if (periodeDeute.equals(EPeriodeDeute.EXECUTIVA)) {// EXEC 

       sql.append("SELECT VGPT_EXE.*, VGPT_EXE_E.* FROM ") 
         .append(Constants.T_VW_GPT_E_BASIC) 
         .append(" VGPT_EXE, ") 
         .append(Constants.T_VW_GPT_E_EXTES) 
         .append(" VGPT_EXE_E ") 
         /* filtre */ 
         .append("WHERE VGPT_EXE.") 
         .append(Constants.CC_ANY + "= ").append("VGPT_EXE_E.") 
         .append(Constants.CC_ANY).append(" AND VGPT_EXE.") 
         .append(Constants.CC_NUM_REBUT + "= ") 
         .append("VGPT_EXE_E.").append(Constants.CC_NUM_REBUT) 
         .append(" AND VGPT_EXE.") 
         .append(Constants.CC_PERIODE + "= ") 
         .append("VGPT_EXE_E.").append(Constants.CC_PERIODE) 
         .append(" AND VGPT_EXE.") 
         .append(Constants.CC_COD_CONCEPTE + "= ") 
         .append("VGPT_EXE_E.") 
         .append(Constants.CC_COD_CONCEPTE) 
         .append(" AND VGPT_EXE.") 
         .append(Constants.CC_COD_EMISOR + "= ") 
         .append("VGPT_EXE_E.").append(Constants.CC_COD_EMISOR) 
         .append(" AND VGPT_EXE.") 
         .append(Constants.CC_COD_PROV + "= ") 
         .append("VGPT_EXE_E.").append(Constants.CC_COD_PROV) 
         .append(" AND VGPT_EXE.") 
         .append(Constants.CC_ANY + "= ? ") 
         .append("AND VGPT_EXE.") 
         .append(Constants.CC_NUM_REBUT + "= ? ") 
         .append("AND VGPT_EXE.") 
         .append(Constants.CC_PERIODE + "= ? ") 
         .append("AND VGPT_EXE.") 
         .append(Constants.CC_COD_CONCEPTE + "= ? ") 
         .append("AND VGPT_EXE.") 
         .append(Constants.CC_COD_EMISOR + "= ? ") 
         .append("AND VGPT_EXE.") 
         .append(Constants.CC_COD_PROV + "= ? "); 
      } 
      if (periodeDeute.equals(EPeriodeDeute.VOLUNTARIA)) {// VOL 
       sql.append("SELECT VGPT_VOL.*, VGPT_VOL_E.* FROM ") 
         .append(Constants.T_VW_GPT_V_BASIC) 
         .append(" VGPT_VOL, ") 
         .append(Constants.T_VW_GPT_V_EXTES) 
         .append(" VGPT_VOL_E ") 
         /* filtre */ 
         .append("WHERE VGPT_VOL.") 
         .append(Constants.CC_ANY + "= ").append("VGPT_VOL_E.") 
         .append(Constants.CC_ANY).append(" AND VGPT_VOL.") 
         .append(Constants.CC_NUM_REBUT + "= ") 
         .append("VGPT_VOL_E.").append(Constants.CC_NUM_REBUT) 
         .append(" AND VGPT_VOL.") 
         .append(Constants.CC_PERIODE + "= ") 
         .append("VGPT_VOL_E.").append(Constants.CC_PERIODE) 
         .append(" AND VGPT_VOL.") 
         .append(Constants.CC_COD_CONCEPTE + "= ") 
         .append("VGPT_VOL_E.") 
         .append(Constants.CC_COD_CONCEPTE) 
         .append(" AND VGPT_VOL.") 
         .append(Constants.CC_COD_EMISOR + "= ") 
         .append("VGPT_VOL_E.").append(Constants.CC_COD_EMISOR) 
         .append(" AND VGPT_VOL.") 
         .append(Constants.CC_COD_PROV + "= ") 
         .append("VGPT_VOL_E.").append(Constants.CC_COD_PROV) 
         .append(" AND VGPT_VOL.") 
         .append(Constants.CC_ANY + "= ? ") 
         .append("AND VGPT_VOL.") 
         .append(Constants.CC_NUM_REBUT + "= ? ") 
         .append("AND VGPT_VOL.") 
         .append(Constants.CC_PERIODE + "= ? ") 
         .append("AND VGPT_VOL.") 
         .append(Constants.CC_COD_CONCEPTE + "= ? ") 
         .append("AND VGPT_VOL.") 
         .append(Constants.CC_COD_EMISOR + "= ? ") 
         .append("AND VGPT_VOL.") 
         .append(Constants.CC_COD_PROV + "= ? "); 
      } 
      try { 

       if (LOG.isDebugEnabled()) { 
        LOG.debug("SQL> " + sql.toString()); 
       } 

       try { 
        llista = jdbcTemplate.query(
          sql.toString(), 
          new Object[] { clauDeute.getCcAny(), 
            clauDeute.getCcNumRebut(), 
            clauDeute.getCcPeriode(), 
            clauDeute.getCodConcepte(), 
            clauDeute.getCodEmissor(), 
            clauDeute.getCodProveidor() }, 
          new MapperDeuteDetall()); 
       } catch (Exception e) { 
        System.out.println(e.getMessage()); 
        e.printStackTrace(); 
       } 

      } catch (DataAccessException ex) { 
       if (LOG.isErrorEnabled()) { 
        LOG.error("No es pot recuperar la llista de deutes bàsics", 
          ex); 
       } 
       throw new GptException(
         "No es pot recuperar la llista de deutes", ex); 
      } 
     } 

просто выберите:

SELECT VGPT_EXE.* 
    , VGPT_EXE_E.* 
    FROM vw_gpt_e_basic VGPT_EXE 
    , vw_gpt_e_extes VGPT_EXE_E 
WHERE VGPT_EXE.cc_any   = VGPT_EXE_E.cc_any 
    AND VGPT_EXE.cc_num_rebut = VGPT_EXE_E.cc_num_rebut 
    AND VGPT_EXE.cc_periode  = VGPT_EXE_E.cc_periode 
    AND VGPT_EXE.cc_cod_concepte = VGPT_EXE_E.cc_cod_concepte 
    AND VGPT_EXE.cc_cod_emisor = VGPT_EXE_E.cc_cod_emisor 
    AND VGPT_EXE.cc_cod_prov  = VGPT_EXE_E.cc_cod_prov 
    AND VGPT_EXE.cc_any   = 1994 
    AND VGPT_EXE.cc_num_rebut = 201 
    AND VGPT_EXE.cc_periode  = 1 
    AND VGPT_EXE.cc_cod_concepte = 500 
    AND VGPT_EXE.cc_cod_emisor = 004 
    AND VGPT_EXE.cc_cod_prov  = 43 
    ; 

это не очень трудно выбрать, но это ужасно медленно. у него много регистров, и оно создано слишком большим количеством таблиц, есть ли способ сделать это быстрее? с java или любым другим.

ty.

+0

Вы можете узнать стоимость одного и того же запроса только с помощью select * и используя select 'column1', 'column2' и т. Д.? – aksappy

+1

Вам нужны все столбцы VGTP_EXE и VGPT_EXE_E? если не только выбрать столбцы, а не все (*)! –

+0

Мне нужны все столбцы, я пытаюсь без ответа ответить. – ZaoTaoBao

ответ

1

Я бы начал с того, что не повторял эти строки запроса снова и снова. Сделайте их static final.

Но это не ваше решение.

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

  1. Запустите EXPLAIN PLAN и найдите сканирование таблицы.
  2. Добавить индексы в столбцы в предложениях WHERE.
  3. Измените порядок предложений WHERE, чтобы в первую очередь отображались те, которые устраняют большинство строк.
+0

Вы правы насчет статического финала, я бы начал с него. ти. – ZaoTaoBao

1

Это зависит от вашей базы данных underking, некоторые базы данных имеют хорошие алгоритмы для настройки предложения where, чтобы как можно скорее минимизировать возвращаемые строки. Если вы не используете эти базы данных, наша база данных не имеет большого интеллекта, закажите где-нибудь пункты

Так что, если, например, VGPT_EXE.cc_periode = 1 делает много строк из выбора, поставьте его первым. Вам необходимо проанализировать данные в таблице, чтобы узнать лучший порядок.

1

Этот запрос может создавать проблемы.

  1. Query Compiler может занимать много времени, если в таблице много столбцов.
  2. Выбор всех столбцов определенно уменьшит ваши шансы использования индекса покрытия.
  3. Могут быть транзакции TEMPTABLE (я не совсем уверен в этом), которые могут повлиять.

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

Смежные вопросы