Você está na página 1de 1

Oracle - Performance em Consultas com Protheus (Tunning)

Por Márcio Borges

As principais recomendações para as Query´s (consultas) são:

Pré-requisitos para o Oracle conseguir usar os índices:

O Primeiro campo dos índices deve sempre ser informado, como para o Protheus todos os
índices começam com Filial, então, informar a Filial se faz como obrigatório

• Fazer sempre uso da primeira coluna do índice, que no caso do Protheus é sempre
colocar a filial. Para os casos em que a tabela possui o modo compartilhado, ou seja, a
filial é em branco usar como o exemplo: "B1_FILIAL = ' '". Para o caso em que a filial é
exclusiva, ou se especifica a filial, ex: "F1_FILIAL = '13'", ou para ver todos os registros,
pode-se utilizar a cláusula como exemplo "F1_FILIAL > CHR(0).

A concatenação entre cadeia de caracteres ( que no Oracle se dá via caractere pipe: ||)
deve ser evitada. Visto que desta forma o Oracle precisa concatenar todos os registros antes
de efetuar o filtro dos dados na amarração entre tabelas. A utilização de concatenação não faz
busca por índice. O mesmo ocorre com operações no início da cadeia de caracteres, como o
“like ‘%teste’, ou a retirada de caracteres do ínicio da cadeia (Ex. TRIM(), LTRIM()). Há impacto
em qualquer manipulação de caracteres, porém no início o impacto é muito significativo.

Uma das alternativas é usar a Cláusula IN para evitar concatenação de colunas, não de strings

Exemplo de melhoria de performance no uso da clausula IN:

Não performático (custo de mais de 13000):

select E5_LA, E.* from se5010 E where e5_filial = ' ' AND
E5_PREFIXO||E5_NUMERO||E5_PARCELA||E5_CLIFOR IN ('UNI050219AA PI0030') and
D_E_L_E_T_ = ' '

Performático (custo de 1):

select E5_LA, E.* from se5010 E where e5_filial = ' ' AND
(E5_PREFIXO,E5_NUMERO,E5_PARCELA,E5_CLIFOR) IN
(('UNI','050219','AA','PI0030'),('MAN','191214','001','PI0030')) and D_E_L_E_T_ = ' '

ou

select E5_LA, E5.* from se5010 E5 where e5_filial = ' ' AND
(E5_PREFIXO,E5_NUMERO,E5_PARCELA,E5_CLIFOR) IN ( select E2_PREFIXO,E2_NUM,
E2_PARCELA, E2_FORNECE from se2010 E where e2_filial = ' ' AND E2_NUM='050219' AND
E2_PREFIXO='UNI' AND E2_PARCELA='AA' and e.D_E_L_E_T = ' ') and D_E_L_E_T = ' '

Evite o uso do DISTINCT. Normalmente é usado este comando quando há problemas entre a
amarração (JOIN) entre as tabelas.

Você também pode gostar