Possuo uma pagina principal (em JSP) que retorna uma lista de objetos, com 7 atributos cada objeto.Para cada objeto faço dois selects para calcular um valor.O grande porém é que minha pagina principal está lenta para carregar.Criei índices para tabela destes objetos mas mesmo assim continua lenta ao carregar pela primeira vez e/ou ao fazer o redirecionamento de volta.Alguém tem alguma dica para torná-la mais rápida? OBS*: não consigo reduzir mais os selects e pego realmente apenas aquilo que preciso
Ajax?
Mudar o front de JSP para alguma tecnologia mais recente?
Ajax eu utilizo apenas para Pop’ups.O front-end é razoavelmente simples,o problema está no back-end.Gostaria de otimizar as queries entende?
Se já sabe que o problema está na query, então não coloque no post que é problema do carregamento da JSP.
Como está o plano de execução do select? Pelo menos poste o SQL.
Por que não faz apenas um select? Se for muito complexo, pode criar uma function ou stored procedure.
sql = "select count(ia.ID_GAR)AS qtdAut, count(lb.ID_GAR) AS qtdLb,count(inf.ID_GAR)AS qtdInf from garantias as g
+ left join itens_automotivo as ia on g.ID_GARANTIA=ia.ID_GAR
+ left join itens_linhabranca as lb on g.ID_GARANTIA=lb.ID_GAR
+ left join itens_informatica as inf on g.ID_GARANTIA=inf.ID_GAR where g.ID_GARANTIA= + idgar;"
comando = con.prepareStatement(sql);
ResultSet rs2 = comando.executeQuery();
while (rs2.next()) {
qtdAut = rs2.getDouble("qtdAut");
qtdLb = rs2.getDouble("qtdLb");
qtdInf = rs2.getDouble("qtdInf");
}
rs2.close();
comando.close();
if (qtdAut + qtdInf + qtdLb > 0) {
if (qtdAut > 0) {
tot = qtdAut;
sql = "select count(iae.ID_GAR)AS fin from garantias as g "
+ "left join itens_automotivo as iae on g.ID_GARANTIA=iae.ID_GAR where g.ID_GARANTIA=" + idgar + " and iae.LAUDO=1";
}
if (qtdLb > 0) {
tot = qtdLb;
sql = "select count(iae.ID_GAR)AS fin from garantias as g "
+ "left join itens_linhabranca as iae on g.ID_GARANTIA=iae.ID_GAR where g.ID_GARANTIA=" + idgar + " and iae.LAUDO=1";
}
if (qtdInf > 0) {
tot = qtdInf;
sql = "select count(iae.ID_GAR)AS fin from garantias as g "
+ "left join itens_informatica as iae on g.ID_GARANTIA=iae.ID_GAR where g.ID_GARANTIA=" + idgar + " and iae.LAUDO=1";
}
comando = con.prepareStatement(sql);
rs2 = comando.executeQuery();
while (rs2.next()) {
fin = rs2.getDouble("fin");
}
rs2.close();
comando.close();
DecimalFormatSymbols dfs = new DecimalFormatSymbols();
dfs.setDecimalSeparator('.');
DecimalFormat df = new DecimalFormat("0.00", dfs);
gar.setPROGRESSO(Double.valueOf(df.format((fin / tot) * 100)));
O problema está aqui,com o resultado do primeiro select irei verificar qual tabela farei outro select pra calcular o valor.Este processo deve estar causando lentidão na página.
Qual query está levando mais tempo? Já deu uma olhada no plano de execução da query?
Em último caso poderia fazer uma stored procedure, processando tudo que for necessário para o resultado de uma vez só no banco.
A sua query tem o sinal +, põem o + fora das aspas
Ex:
"Query "
+ "left join ..."
Como posso ver o plano de execução da query?
E visualmente com a ferramenta Workbench:
https://dev.mysql.com/doc/workbench/en/wb-tutorial-visual-explain-dbt3.html
Consegui reduzir a quantidade de selects agora está mais rápido.