Como Otimizar Consulta a varias tabelas de um banco de dados

4 respostas
N

tem algum modo de eu otimizar essa consulta a um banco de dados postgres?, pois esta demorando muito.
ao total são 8 tabelas uma diferente da outra mas todas contem informações necessária pra gerar o que preciso.

String sql = "select distinct " + "A.*, " //+ "to_char(A.emissao, 'DD/MM/YYYY') femissao" + "B.*, B.id idfinanceiro, B.status cStatus, B.tipo fTipo, " + "C.*, C.valor valorfinanceiro, " + "D.*, D.razaosocial rzCliente, D.nome nomeCliente, D.endereco endCliente, " + "D.cnpjcpf cpfCliente, D.inscricaoestadual ieCliente, D.complemento compCliente, " + "D.cep cepCliente, D.endereco endCliente, D.numeroendereco numCliente, " + "D.bairro bairroCliente, " + "E.codigo nomecidade, E.id codCidade, " + "F.*, F.nome estadoCliente, F.codigo codestadoCliente, " + "G.*, G.razaosocial rzEmpresa, G.cnpj cnpjEmpresa, G.inscricaoestadual ieEmpresa, " + "G.endereco endEmpresa, G.cidade cidadeEmpresa, G.estado estadoEmpresa, G.bairro bairroEmpresa, " + "G.complemento compEmpresa, G.numero numEmpresa, G.cep cepEmpresa, " + "H.* " + "from " + "notafiscal as A " + "join financeiro as B on A.id = B.idorigem " + "join eventofinanceiro as C on A.id = C.idorigem " + "left join entidade as D on C.identidade = D.id " + "left join cidade as E on D.idcidade = E.id " + "left join estado as F on D.idestado = F.id " + "left join filial as G on G.id = A.idfilial " + "left join notafiscal as H on C.idorigem = H.id " + "order by B.id asc";

4 Respostas

N

Será que consigo de alguma forma otimizar esse código pois esta demorando 6 segundos para concluir a pesquisa...

package aplicativo.duplicata;

import aplicativo.database.CriaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author carlos augusto
 */
public class DuplicataDao {

    private Connection conexao;

    public DuplicataDao() throws SQLException {
        this.conexao = CriaConexao.getConexao();
    }

    // Gera a lista do Contas a Receber
    public List<DadosDuplicata> getContas(String CheckStatus) throws SQLException, ParseException {
        

        String sql = "select distinct "
                + "A.*, "
                + "B.*, B.id idfinanceiro, B.status cStatus, B.tipo fTipo, "
                + "C.*, C.valor valorfinanceiro, "
                + "D.*, D.razaosocial rzCliente, D.nome nomeCliente, D.endereco endCliente, "
                + "D.cnpjcpf cpfCliente, D.inscricaoestadual ieCliente, D.complemento compCliente, "
                + "D.cep cepCliente, D.endereco endCliente, D.numeroendereco numCliente, "
                + "D.bairro bairroCliente, "
                + "E.nome nomecidade, E.id codCidade, "
                + "F.*, F.nome estadoCliente, F.codigo codestadoCliente, "
                + "G.*, G.razaosocial rzEmpresa, G.cnpj cnpjEmpresa, G.inscricaoestadual ieEmpresa, "
                + "G.endereco endEmpresa, G.cidade cidadeEmpresa, G.estado estadoEmpresa, G.bairro bairroEmpresa, "
                + "G.complemento compEmpresa, G.numero numEmpresa, G.cep cepEmpresa, "
                + "from "
                + "notafiscal as A "
                + "join financeiro as B on A.id = B.idorigem "
                + "join eventofinanceiro as C on A.id = C.idorigem "
                + "left join entidade as D on C.identidade = D.id "
                + "left join cidade as E on D.idcidade = E.id "
                + "left join estado as F on D.idestado = F.id "
                + "left join filial as G on G.id = A.idfilial "
                + "order by B.id desc";

        PreparedStatement stmt = this.conexao.prepareStatement(sql);

        ResultSet rs = stmt.executeQuery();

        List<DadosDuplicata> lista = new ArrayList<DadosDuplicata>();

        long CheckDados = 0;
        int getPosition = -1;
        boolean getValidacao = false;

        while (rs.next()) {
            DadosDuplicata dados = new DadosDuplicata();

            if (CheckDados != Long.valueOf(rs.getString("idorigem"))) {

                String checkTipo = rs.getString("fTipo");

                if ("R".equals(checkTipo)) {

                    String checkStatus = rs.getString("cStatus");

                    if (("Abertos".equals(CheckStatus) && "A".equals(checkStatus))
                            || ("Baixados".equals(CheckStatus) && "Q".equals(checkStatus))
                            || ("Ambos".equals(CheckStatus))) {

                        getPosition++;
                        getValidacao = true;

                        CheckDados = Long.valueOf(rs.getString("idorigem"));

                        //===== - Dados Duplicata - =====//

                        //----- - Dados Cabeçalho
                        dados.setId(Integer.valueOf(rs.getInt("idfinanceiro")));
                        dados.setValorTotal(Double.valueOf(rs.getString("valorfinanceiro")));
                        dados.setValor(Double.valueOf(rs.getDouble("valorfinanceiro")));
                        dados.setStatus(rs.getString("idorigem"));
                        dados.setParcela(Integer.valueOf(rs.getInt("parcela")));
                        dados.setQParcelas(Integer.valueOf(rs.getInt("parcela")));
                        dados.setEmissao(rs.getDate("emissao"));
                        dados.setFatura(String.valueOf(rs.getString("numeronotafiscal")));
                        dados.setVencimento(rs.getDate("vencimento"));
                        dados.setValorextenso(Double.valueOf(rs.getDouble("valorfinanceiro")));

                        //----- - Dados Empresa
                        dados.setRazaoSocial(String.valueOf(rs.getString("rzEmpresa")));
                        dados.setCnpj(String.valueOf(rs.getString("cnpjEmpresa")));
                        dados.setIestadual(String.valueOf(rs.getString("ieEmpresa")));
                        dados.setEndereco(String.valueOf(rs.getString("endEmpresa")));
                        dados.setBairro(String.valueOf(rs.getString("bairroEmpresa")));
                        dados.setNumero(String.valueOf(rs.getString("numEmpresa")));
                        dados.setComplemento(String.valueOf(rs.getString("compEmpresa")));
                        dados.setCidade(String.valueOf(rs.getString("cidadeEmpresa")));
                        dados.setEstado(String.valueOf(rs.getString("estadoEmpresa")));
                        dados.setCep(String.valueOf(rs.getString("cepEmpresa")));

                        //----- - Dados Cliente
                        dados.setNomeCliente(rs.getString("nomeCliente"));
                        dados.setRazaoSocialCliente(rs.getString("rzCliente"));
                        dados.setCpfCliente(rs.getString("cpfCliente"));
                        dados.setEndCliente(rs.getString("endCliente"));
                        dados.setNumCliente(rs.getString("numCliente"));
                        dados.setComCliente(rs.getString("compCliente"));
                        dados.setBairroCliente(rs.getString("bairroCliente"));
                        dados.setCidadeCliente(rs.getString("nomecidade"));
                        dados.setCodCidadeCliente(rs.getString("codCidade"));
                        dados.setEstadoCliente(rs.getString("estadoCliente"));
                        dados.setCodEstadoCliente(rs.getString("codestadoCliente"));
                        dados.setCepCliente(rs.getString("cepCliente"));
                        dados.setIestadual(rs.getString("ieCliente"));

                        lista.add(dados);
                    }
                }
            } else {
                if (getValidacao) {
                    if (lista.get(getPosition).getQParcelas() < Integer.valueOf(rs.getInt("parcela"))) {
                        lista.get(getPosition).setQParcelas(Integer.valueOf(rs.getInt("parcela")));
                    }
                    lista.get(getPosition).setVencimento(rs.getDate("vencimento"));
                }
            }
        }

        rs.close();

        stmt.close();
        return lista;
    }
}
mrrbigu

Sugiro que teste primeiro o comando sql direto no banco, numa consulta, veja o tempo de execução lá e verifique se há necessidade de criar novos índices, alguns bancos fazem como o SQL Server tem ferramentas para ajudar nesse tipo de análise.

Após isso analise seu código, você me parece estar usando muita lógica e filtros nos dados que retornam do banco, se você puder enviar esses filtros no comando sql, será mais rápido pois você receberá menos registros.

N

eu tentei enviar os filtros juntos, mas não deu certo, não apresentou as consultas, por isso acabei fazendo os filtros separados

mrrbigu

NeoWolfer, é muito rara uma situação onde não seja possível passar o filtro via SQL, e seja necessário implementá-lo no código, talvez você esteja precisando de uma ajuda no SQL.
Nesse caso penso que compensa “quebrar a cabeça” e tentar colocar os filtros no SQL, pois certamente você terá muito ganho em desempenho, o que é o seu objetivo.

Criado 20 de outubro de 2013
Ultima resposta 31 de out. de 2013
Respostas 4
Participantes 2