1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como posso otimizar queries?

Olá, eu queria saber se existem algumas técnicas específicas para se otimizar o tempo de execução de queries. O meu ambiente tem os itens abaixo:

  • JBoss 7.1.1 (Brontes)
  • Oracle 11g
  • JPA (Hibernate)
  • EJB 3

Com os itens que utilizo acima existe alguma técnica para se otimizar a execução de queries?

Existe uma funcionalidade no sistema em que trabalho que apresenta lentidão esporádica, então pediram pra eu agilizar o processo. O problema é que a tabela em questão é enorme, e eu não posso mudar isso. É uma tabela de Arquivo, onde são armazenados todos os arquivos, cada um com o seu TIPO_ARQUIVO.

Nessa tabela tenho que fazer uma query que retorna o COUNT de todos os arquivos de um determinado tipo. As vezes a query retorna em 200ms, as vezes em 8000ms e outras vezes até mais que isso, e eu não consigo identificar o que determina isso.

Já foi feito o seguinte:

  • Foi criado um índice na tabela, o que ajudou bastante
  • O datasource foi alterado para manter um pool de conexões:
<xa-pool>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>100</max-pool-size>
</xa-pool>
  • Foi adicionado cache de PreparedStatements
<statement>
    <prepared-statement-cache-size>100</prepared-statement-cache-size>
    <share-prepared-statements>true</share-prepared-statements>
</statement>

E o EJB em questão foi anotado com @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) para não abrir nenhuma transação desnecessária, visto que só preciso buscar dados.

Tudo isso ajudou, porém ainda não parece ser suficiente para agradar o cliente :-) Existe alguma outra técnica que eu posso tentar nesse ambiente que especifiquei?

Lembrando que a query executa com tempos muito variados, isso que causou toda essa confusão.

  • @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) não significa exatamente sempre a melhor opção para consulta, significa que caso exista alguma transação corrente, ele irá suspendela, o que te dá margens para fazer um try/catch em torno dela sem comprometer a transação corrente. Se isso não for de necessidade no seu papel atual, um TransactionAttributeType.SUPPORTS as vezes pode fazer mais sentido.

    SUPPORTS: If the client calls with a transaction context, the container performs the same steps as described in the REQUIRED case.

    WRYEL   14 de jul de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags ejb jboss jpa otimização ou faça a sua própria pergunta.