我正处于一场战争中,一个选择攻击一个视图(非常大的视野)。我的问题是我想减少响应时间,因为我可以上厕所,回来做三明治。我希望道歉我的幽默感。所以这就是着名的选择:
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 :(得分:1)
我首先不要一遍又一遍地创建这些查询字符串。让他们static final
。
但那不是你的解决方案。
问题是你的查询。以下是一些可以尝试加快速度的方法:
答案 1 :(得分:1)
这取决于你的数据库,一些数据库有很好的算法来自定义where子句,以尽快减少返回的行。 如果您没有使用这些数据库,您的数据库没有太多智能,请重新命令where子句
因此,例如,如果VGPT_EXE.cc_periode = 1
从select中生成大量行,则将其放在第一位。您需要分析表格中的数据以找出最佳订单。
答案 2 :(得分:1)
此查询可能会产生问题。
建议您查看解释计划,查询成本并根据您的原始要求尝试调整查询。