Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Cobra

Cache de consulta

Recommended Posts

Boa tarde pessoal, estou com um problema/dúvida relacionado ao Oracle e, como não entendo praticamente nada desse banco, venho pedir a ajuda de vocês:

 

Aqui na empresa, temos uma aplicação acessada, normalmente, por umas 50 pessoas ao mesmo tempo. Na aplicação, há um menu que sempre tem que ser gerado através de uma consulta no banco, pela questão da permissão dos usuários logados. No entanto, isso está gerando sérios problemas, visto que são feitas diversas inserções, alterações e exclusões simultaneamente, e sempre gerando o mesmo menu (que, em certos casos, retorna mais de 100 opções), o que está deixando a aplicação muito lenta...

 

Bom, minha dúvida é a seguinte: seria possível criar uma espécie de cache para cada usuário, que armazenasse a consulta do menu e fosse limpo a cada X horas (por exemplo)?? Ou alguma outra coisa nesse sentido?

 

Se alguém souber de qualquer coisa para ajudar, fico grato.

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

As consultas do Oracle quando escritas por meio de variáveis bind , só são compiladas uma vez , depois disto são apenas reexecutadas.

As tabelas mais acessadas ficam em memória.

O que pode ocorrer é que a query que faz este acesso não está otimizada gerando custo desnecessário ou sem usar as bind , isto ocorre quando a query e montanda por concactenação de strings.

1) Faça o plano de execução da query e veja se pode melhorar algo.

2) Veja como a query é montada pela aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Complementando...

 

Pode ocorrer também (como ocorre DML) locks no banco de dados, verificar isso.

 

No Oracle, existe a opção de colocar a tabela e procedure em CACHE.

 

Para a tabela, pode colocar a opção de buffer pool, exemplo:

 

ALTER TABLE <tabela> CACHE;

ou

ALTER TABLE <tabela> storage (buffer_pool keep);

 

Ambos, irá depender do tamanho dimensionado no parâmetro db_buffer_pool da sua instância.

 

E para os procedures, pode ser feito assim:

 

SQL> exec dbms_shared_pool.keep('<owner>.<procedure>');

 

Isso pode aumentar a performance e resolver alguns problemas. Mas lembre-se, tem que ocorrer uma vistoria no seu banco de dados, veja como estão os wait events, atividades do banco e etc..

 

Abraços, :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.