Desempenho em consultas

Olá!

Estou começando um novo sistema, onde a todo o momento o usuário fará continuas pesquisa ao banco.

Encontramos duas soluções para resolver, mas esbarramos em uma questão de desempenho.

Imaginemos que temos uma tabela Pessoa, por exemplo, e tenhamos que realizar uma consulta de todas as pessoas com determinado nome.

Aplicando as soluções encontradas, teremos duas situações.

  1. Consultas especificas,criar uma consulta especifica no banco
  1. Consulta todos e seleciona via código os valores desejados.

List list = execute(SELECT * FROM Pessoa as p).getList(); for(Pessoa p:list){ if(p.getNome().equals(nomePassadoComoParametro)) System.out.println(p.getNome());//Somente pra indicar que esta pessoa será armazenada em outra lista. }

Observando as duas soluções vemos que na segunda podemos aplicar o padrão Specification e resolver de uma forma simples e bem legal esta estrategia.
Ja na primeira é melhor pois o proprio SGBD ‘gerenciaria’ todo o contexto de transação e retornaria somente os valores já prontos.

Agora analisando pelo lado de desempenho da aplicação qual seria a melhor solução?

Att…

Recomendo a primeira abordagem, pois ela mantém no servidor de Banco de Dados a responsabilidade de otimizar a leitura das informações através da manutenção de índices, gerenciamento de cache e etc. A segunda abordagem tende a consumir muita memória no cliente (como sua aplicação vai se comportar quando a tabela Pessoa contiver 100 mil registros? Você pode ter de percorrer 100 mil para filtrar apenas 20…).

Uma coisa que até hoje eu não vi falhar foi: Qual é o principal gargalo em qualquer aplicação? Tráfego de rede. Acho que só com isso já respondemos a pergunta neh!?!?

Dica bem rápida: não utilize patterns, a menos que eles sejam a melhor opção.
Patterns são sobre como resolver determinado problema da melhor maneira, e não sobre resolver todo e qualquer problema…