[Resolvido] Agilizar consulta em 20 milhoes de registros
8 respostas
J
jeanmalvessi
Boa tarde galera!
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:
publicList<Finalidade> getFinalidadeByClienteProd(Pessoa cliente, ProdServ prod) {EntityManagerem=getEntityManager();try{
Queryq=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);returnq.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.
J
jeanmalvessi
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.
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=?
Não entendi o que quis dizer aqui:
Estou usando PostgreSQL.
Obrigado
X
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…
G
gilvanandre
Também indico uma chave composta, a consulta vai diretamente para onde deve ir!
E
entanglement
jeanmalvessi:
Não entendi o que quis dizer aqui:
Estou usando PostgreSQL.
Obrigado
É 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.
J
jeanmalvessi
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…
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:
G
gilvanandre
jeanmalvessi:
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…
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:
De nada!
J
jeanmalvessi
gilvanandre:
jeanmalvessi:
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…
Rodei um VACUUM E ANALYZE e fiz a chave composta que você sugeriu… Minha busca reduziu de 11 para 3 segundos!