Estou precisando fazer uma busca em uma tabela que possui atualmente 20 milhōes de registros, utilizando o hibernate.
Eu consigo fazer a busca, mas ela demora consideravelmente para retornar os objetos.
Gostaria de saber se há alguma forma de agilizar este processo, pois o local do sistema que ela está sendo utilizada requer rapidez.
Segue a JPQL que estou usando no momento:
public List<Finalidade> getFinalidadeByClienteProd(Pessoa cliente, ProdServ prod) {
EntityManager em = getEntityManager();
try {
Query q = em.createQuery("select o.finalidade from TributoCliProd as o "
+ "WHERE o.pessoa = :cli "
+ "AND o.prodServ = :prod ");
q.setParameter("cli", cliente);
q.setParameter("prod", prod);
return q.getResultList();
} finally {
em.close();
}
}
No seu caso dá a impressão que você precisa de um índice adequado na sua tabela, já que é uma consulta que retorna apenas alguns poucos registros e pelo que podemos julgar, a consulta SQL resultante dessa consulta HQL parece ser simples também.
No seu caso, é interessante (você é expert no Hibernate ?) verificar qual é a consulta SQL que foi gerada, e então usar uma ferramenta do seu banco de dados para ver que tipo de melhoramentos é possível fazer no banco para melhorar a consulta.
[quote=entanglement]No seu caso dá a impressão que você precisa de um índice adequado na sua tabela, já que é uma consulta que retorna apenas alguns poucos registros e pelo que podemos julgar, a consulta SQL resultante dessa consulta HQL parece ser simples também.
No seu caso, é interessante (você é expert no Hibernate ?) verificar qual é a consulta SQL que foi gerada, e então usar uma ferramenta do seu banco de dados para ver que tipo de melhoramentos é possível fazer no banco para melhorar a consulta. [/quote]
Obrigado pela resposta!
A consulta gerada foi a seguinte:
select finalidade1_.codigo_finalidade as codigo1_1915_,
finalidade1_.codigo_cfop as codigo7_1915_,
finalidade1_.gera_cobranca as gera2_1915_,
finalidade1_.gera_comissao as gera3_1915_,
finalidade1_.icms as icms1915_,
finalidade1_.loginestab as loginestab1915_,
finalidade1_.movimenta_estoque as movimenta5_1915_,
finalidade1_.codigo_natureza_operacao as codigo10_1915_,
finalidade1_.nome as nome1915_,
finalidade1_.prodserv as prodserv1915_
from TributoCliProd tributocli0_ inner join Finalidade finalidade1_ on tributocli0_.codigo_finalidade=finalidade1_.codigo_finalidade
where tributocli0_.codigo_pessoa=? and tributocli0_.codigo_prodserv=?
Crie um inidice composto para a entidade nos atributos pessoa e prodServ…
Um VACUUM e um ANALYZE devem dar uma otimizada na indexação das informações do banco.
O índice composto certamente é o que ira trazer maior efeito em termos de performance…
[quote=jeanmalvessi]
Não entendi o que quis dizer aqui:
Estou usando PostgreSQL.
Obrigado[/quote]
É assim. Dependendo do banco de dados que você usa, o próprio fornecedor, ou então alguma ferramenta de terceiros, possibilita lhe dizer que tipo de coisas você tem de fazer no seu banco. No caso do MS SQL Server, há um wizard que analisa sua consulta e as estatísticas de uso do banco, e indica se é possível otimizar a consulta e sugere que tipos de índices devem ser adicionados a ele.
Não sei o que está disponível para o PostgreSQL, mas isso não deve ser difícil de encontrar.
[quote=Xmio]Crie um inidice composto para a entidade nos atributos pessoa e prodServ…
Um VACUUM e um ANALYZE devem dar uma otimizada na indexação das informações do banco.
O índice composto certamente é o que ira trazer maior efeito em termos de performance…[/quote]
Rodei um VACUUM E ANALYZE e fiz a chave composta que você sugeriu… Minha busca reduziu de 11 para 3 segundos!
[quote=jeanmalvessi][quote=Xmio]Crie um inidice composto para a entidade nos atributos pessoa e prodServ…
Um VACUUM e um ANALYZE devem dar uma otimizada na indexação das informações do banco.
O índice composto certamente é o que ira trazer maior efeito em termos de performance…[/quote]
Rodei um VACUUM E ANALYZE e fiz a chave composta que você sugeriu… Minha busca reduziu de 11 para 3 segundos!
Obrigado pela ajuda Xmio e entanglement :lol:[/quote]
[quote=gilvanandre][quote=jeanmalvessi][quote=Xmio]Crie um inidice composto para a entidade nos atributos pessoa e prodServ…
Um VACUUM e um ANALYZE devem dar uma otimizada na indexação das informações do banco.
O índice composto certamente é o que ira trazer maior efeito em termos de performance…[/quote]
Rodei um VACUUM E ANALYZE e fiz a chave composta que você sugeriu… Minha busca reduziu de 11 para 3 segundos!
Obrigado pela ajuda Xmio e entanglement :lol:[/quote]