Utilizando Hints no Oracle


Olá pessoal,

 

O Oracle oferece hints(sugestões) que você pode especificar em uma determinada consulta para tentar conseguir melhorar o desempenho. Hints são utilizadas para influenciar o otimizador baseado em custo para controlar os métodos de acesso e condições de junções etc.

 

Segue abaixo a lista das hints mais usadas:

 

- first_rows: Para forçar o uso de índice de modo geral. Faz com que o otimizador escolha um caminho que apanha a 1º linha ou N linhas mais rapidamente.

 

SQL> select /*+ first_rows (100) */ coluna_1, coluna_2 …

           from nome_tabela;

 

- all_rows: Para forçar um scan complete na tabela.

 

SQL> select /*+ all_rows (100) */ coluna_1, coluna_2 …

           from nome_tabela;

 

- full: Para forçar um scan completo na tabela. O custo da leitura do índice e das linhas pode ser maior do que simplesmente ler a tabela inteira. A hint full também pode causar resultados inesperados como scan na tabela em ordem diferente da ordem de acesso.

 

SQL> select /*+ full_rows (emp) */ coluna_1, coluna_2

           from emp

           where col_1 = 1 ;

 

- index: Para forçar o uso de um índice.

 

 SQL> select /*+ index */ emp_no, emp_name, depto_no

           from emp

           where depto = 1 and empno = 7750 ;

 

* No exemplo acima, nenhum índice é especificado. O Oracle pesa todos os índices possíveis e escolhe um ou mais a serem usados. Como escolhemos a hint index, o otimizador não fará um scan completo na tabela.

 

Exemplo do uso da hint index informando os índices que devem ser utilizados:

 

SQL> select /*+ index (emp depto_no_idx) */ emp_no, emp_name, depto_no

           from emp

           where depto = 1 ;

 

- no_index: É utilizado para evita que um índice especificado seja usado.

 

 SQL> select /*+ no_index (nome_tabela indice_1, indice_2,...) */ coluna_1

           from nome_tabela ;

 

- index_join : Permite mesclar índice em uma única tabela. Permite acessar somente os índices da tabela, e não apenas um scan com menos bloco no total, é mais rápido do que usar um índice que faz scan na tabela por rowid.

Na consulta abaixo, o otimizador juntará os índices regiao_idx e codigo_idx e não terá de acessar a tabela tabela_1.

 

SQL> select /*+ index_join (tabela_1 regiao_idx, codigo_idx) */ regiao, codigo

           from tabela_1

           where regiao = 'Sul ' and codigo = 2 ;

 

- and_equal : Para acessar todos os índices que você especificar. A hint and_equal faz com que o otimizador misture vários índices para uma única tabela em vez de escolher qual é ao melhor.

 

SQL> select /*+ and_equal (tabela_1 depto_no_idx, emp_no_idx) */ emp_no, emp_name

           from emp

           where depto_no = 1 and emp_no = 7750 ;

 

- index_combine: É utilizado para acessar diversos índices do tipo bitmap. Faz com que o otimizador misture vários índices bitmap para uma única tabela em vez de escolher qual é a melhor.

 

 SQL> select /*+ index_combine (nome_tabela indice_1, indice_2) */ coluna_1,coluna_2

            from nome_tabela ;

 

- index_ffs: Força um scan completo do índice. Acessa apenas o índice, e não apenas a tabela correspondente. Ele só será usado se todas as informações que a consulta precisa apanhar estiverem no índice. Essa hint pode oferecer grandes ganhos de desempenho, especialmente quando a tabela também possuir um grande numero de colunas.

 

SQL> select /*+ index_ffs (emp depto_no_idx) */ depto_no, emp_no

           from emp

           where depto_no = 1;

 

Há muitas hints que você pode usar, e este artigo mostrou as mais utilizadas. Para maiores detalhes e uma lista detalhada das hints, você pode ler a Oracle10g Database Performance Tuning Guide (disponível para download no endereço http://www.oracle.com/pls/db102/homepage )

 

Por hoje é tudo pessoal,

 

Até o próximo artigo,

 

André Luiz Gomes Antunes

“Keeping IT Running”