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