sexta-feira, 29 de julho de 2011

Cursor_Sharing

Nesta semana estive diante de um problema de uma aplicação com o uso de "literais" como parametros em alguns select como um exemplo :


Select COD_PAIS , DS_PAIS FROM PAISES WHERE COD_CONT = 'EU' ;

Com isso estou com problema de uma queries simples como essa acima ter para cada execução ,um plano de execução em memória no Oracle.Como não é fácil "convencer" a um desenvolvedor que esse tipo de escrita de select não é a melhor e que ao invés de usar uma literal como parâmetro ele poderia utilizar a nossa Bind variable .Resolvi procurar algo que diminuísse o estrago que estava acontecendo.

O parâmetro Cursor_Sharing trabalha nessa direção .Ele aceita 3 valores, sendo eles: FORCE, SIMILAR e EXACT.

EXACT – é o padrão para banco de dados Oracle. O parâmetro EXACT envia ao otimizador do Oracle que toda e qualquer instrução deve ser igual inclusive os valores literais.Este é o parametro do meu SGDB e com isso fico dependendo da boa vontade do desenvolvedor.

FORCE – O parâmetro troca as variáveis literais por valores bind, em sua execução, fazendo com que o HARD-PARSE se transforme em SOFT. O valor FORCE no parametro CURSOR_SHARING, gera apenas 1 plano de execução.Porem não consegui identificar em que esta opção pode nos trazer problemas.Pense bem.Se ela fosse livre de riscos ,poque não seria a opção default ??

SIMILAR – O parâmetro troca as variáveis literais por valores bind, em sua execução.
O valor SIMILAR no parametro CURSOR_SHARING, parece agir da mesma forma que o valor FORCE,mas diferente do FORCE , o SIMILAR gera mais de um plano de execução (se a tabela estiver com a coleta de estatísticas atualizada).

O CURSOR_SHARING é um cara meio problemático. Se você fizer uma busca no
Metalink, vai ver vários problemas associados. Quando migramos para o 11g
onde eu trabalho, houve um ORA-0600 .Porem ,pode ser uma alternativa.





quarta-feira, 13 de julho de 2011

Lista de Processos Oracle em Execução na Instancia

Segue uma query para descobrirmos a lista de Processos Oracle em Execução na Instancia :

Select Sid,Serial#,Process,Name,Description
From V$session Ss
Join V$bgprocess Bg
On Bg.Paddr = Ss.Paddr

terça-feira, 5 de julho de 2011

Forma rápida de Eliminar Sessões Maléficas

Todos nós conhecemos a opção do commando "KILL"muito utilizado para eliminar sessões maléficas ou incoerentes num database.Mas que não executou um Kill numa sessão e depois disso recebe a seguinte resposta “session market for kill” e esta sessão continua por um determinado período perturbando ? Isto acontece porque existe toda um controle do Oracle para confirmar que realmente a sessão pode ser morta .

Em contato com algums DBA venho vendo que um alternativa muito interessante vem sendo o uso do commando disconnect para estas sessões como no exemplo abaixo :

SQL> ALTER SYSTEM DISCONNECT SESSION ‘sid,serial#’ IMMEDIATE;

a Opção immediate pode ser modificada pela opção POST_TRANSACTION (esperar o fim da Transação corrente).Em momentos críticos ,pode ser um alternativa ao Kill Session .