0

我正在与一个选择攻击视图(非常大的视图)的战争中。我的问题是我想减少响应时间,因为我可以去厕所,回来做三明治。我希望为我的糟糕幽默感道歉。所以这是著名的选择:

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或其他什么。

泰。

4

3 回答 3

1

此查询可能会产生问题。

  1. 如果表中有很多列,查询编译器可能会花费很多时间。
  2. 选择所有列肯定会减少使用覆盖索引的机会。
  3. 可能有 TEMPTABLE 交易(我对此不完全确定)可能会影响。

建议您查看说明计划、查询成本并尝试根据您的原始要求调整查询。

于 2013-09-06T11:41:54.117 回答
1

这取决于你的下属数据库,一些数据库有很好的算法来定制 where 子句以尽快最小化返回的行。如果您没有使用我们的这些数据库,则您的数据库没有太多智能,请重新排序 where 子句

因此,例如,如果VGPT_EXE.cc_periode = 1从 select 中生成很多行,则将其放在首位。您需要分析表中的数据以找出最佳顺序。

于 2013-09-06T11:40:31.167 回答
1

我首先不会一遍又一遍地创建这些查询字符串。制作它们static final

但这不是你的解决方案。

问题是您的查询。您可以采取以下措施来加快速度:

  1. 运行 EXPLAIN PLAN 并查找表扫描。
  2. 向 WHERE 子句中的列添加索引。
  3. 重新排序 WHERE 子句,使消除最多行的子句首先出现。
于 2013-09-06T11:22:32.530 回答