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”