使用jdbcTemplate优化select创建

时间:2013-09-06 11:15:17

标签: java spring jdbc

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

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。

3 个答案:

答案 0 :(得分:1)

我首先不要一遍又一遍地创建这些查询字符串。让他们static final

但那不是你的解决方案。

问题是你的查询。以下是一些可以尝试加快速度的方法:

  1. 运行EXPLAIN PLAN并查找表扫描。
  2. 将索引添加到WHERE子句中的列。
  3. 重新排序WHERE子句,以便首先显示消除最多行的那些。

答案 1 :(得分:1)

这取决于你的数据库,一些数据库有很好的算法来自定义where子句,以尽快减少返回的行。 如果您没有使用这些数据库,您的数据库没有太多智能,请重新命令where子句

因此,例如,如果VGPT_EXE.cc_periode = 1从select中生成大量行,则将其放在第一位。您需要分析表格中的数据以找出最佳订单。

答案 2 :(得分:1)

此查询可能会产生问题。

  1. 如果表格中有很多列,查询编译器会占用大量时间。
  2. 选择所有列肯定会降低使用覆盖索引的机会。
  3. 可能有影响的TEMPTABLE交易(我不完全确定)。
  4. 建议您查看解释计划,查询成本并根据您的原始要求尝试调整查询。