Desabilitando o HINT do Top Connect com o Oracle
OBS : Faça por conta e risco, teste primeiro ou consulte um Dba.
Para quem trabalha com o Protheus utilizando o Top Connect e o Oracle, já teve por curiosidade ou necessidade, percebido que em todos os selects feitos pela base, sempre tem um HINT adicionado após a palavra SELECT.
Observe uma query gerada pelo Protheus logo abaixo :
SELECT /*+
FIRST_ROWS(50) */
R_E_C_N_O_
FROM SA2010
WHERE R_E_C_N_O_ > 50186
AND D_E_L_E_T_ = ' '
ORDER BY R_E_C_N_O_
Observe na query acima que existe uma linha /*+ FIRST_ROWS(50) */ que pode variar um pouco mas o significado é o mesmo.
Este trecho na query faz com que o banco ignore o plano de execução que o Oracle iria executar e de forma forçada, executa a instrução que o Protheus impôs.
De certa forma não de todo ruim, porque, se a base de dados não estiver bem configurada, o Protheus poderia ficar com uma performance bem até pior.
Particularmente, o FIRST_ROWS(50) significa que o Oracle deve retornar os primeiros 50 registros retornados de um Select de forma imediata e posteriormente, o restante o banco poderia carregar com menos prioridade.
Não esta errado, mas vale lembrar que estamos dizendo que o plano de execução gerado pelo Protheus, é melhor do que o plano que seria gerado pelo Oracle.
Se o Top Connect não executasse esta instrução, o plano de execução resultado da query poderia ser o mesmo para ambos os casos e iria depender de como esta configurado o parâmetro OPTIMIZER_MODE.
Atualmente o Top Connect não permite que o Hint seja desabilitado, mas podemos fazer o desligamento desse parâmetro diretamente pelo banco de dados.
Como havia dito anteriormente, este procedimento deve ser executado por um Dba. Este parâmetro desabilita o uso do Hint inclusive para o próprio funcionamento do Oracle.
Então, mão na massa.
Para desabilitar o HINT no banco de dados, temos que executar o seguinte comando no Oracle :
SQL> ALTER SYSTEM SET "_optimizer_ignore_hints"= TRUE SCOPE=BOTH;
Obs: Para surtir efeito, é necessário que a sessão do usuário não seja a mesma.
Este comando não ira alterar o resultado da query, somente ira deixar o plano de execução ser gerado pelo Oracle ao invés de ser imposto pelo Protheus.
Veja como ficou o resultado da mesma query :
SELECT /*+ */
R_E_C_N_O_
FROM SA2010
WHERE R_E_C_N_O_ > 50186
AND D_E_L_E_T_ = ' '
ORDER BY R_E_C_N_O_
Observe que a query e o resultado dela sera o mesmo, a diferença é o plano de execução.
Para quem não sabe o que é um plano de execução, vou resumir de forma simplificada.
Quando executamos uma query, o banco antes de qualquer coisa faz um PARSE, ou seja, primeiro ele verifica se a query esta escrita corretamente, se o usuário tem permissão, se a tabela existe, verifica se a instrução já estava na memória, etc, não vou entrar no assunto DBA, vou deixar para outro dia.
Feito isso, o Oracle vai decidir como ele ira retornar esses dados, de uma forma bem grotesca imagine ima viagem para o interior. Existem diversos caminhos e rodovias que podemos pegar mas dependendo do trânsito podemos pegar o caminho mais longo para chegarmos mais rápido.
Essa inteligência o Oracle tem e já faz sozinho se a sua base estiver bem configurada e com as estatísticas atualizadas.
Com o parâmetro dos HINTS desligados ao invés do Protheus impor um caminho, fica a cargo do Oracle fazer e montar o melhor trajeto.
Desligar ou não o HINT é uma decisão de cada administrador, por isso faça a conta do ganho de tempo ao desligar este parâmetro.
Abraços a todos.














