Académique Documents
Professionnel Documents
Culture Documents
CONHECENDO HINTS
Mesmo sabendo que o otimizador incrivelmente preciso na escolha do caminho de otimizao correto e no uso de
ndices para milhares de consultas no seu sistema, ele no perfeito. O ORACLE possui hints (sugestes) que voc
poder usar para determinadas consultas, de modo que o otimizador seja desconsiderado, na esperana de conseguir
melhor desempenho para determinada consulta.
Os hints modificam o caminho de execuo quando um otimizador processa uma instruo especfica. O parmetro
OPTIMIZER_MODE de init.ora pode ser usado para modificar todas as instrues no banco de dados para que sigam um
caminho de execuo especfico, mas um hint para um caminho de execuo diferente substitui qualquer coisa que esteja
especificada no init.ora. Contudo, a otimizao baseada em custo no ser usada se as tabelas no tiverem sido
analisadas.
Os hints disponveis variam de acordo com a verso do banco de dados instalado. Embora este trabalho focalize apenas
os hints que so usados com maior freqncia, muitos dos hints que no so abordados com detalhes podem oferecer
grandes ganhos de desempenho com um sistema especfico. Todos os hints disponveis para sua verso de banco de
dados, podem ser encontrados no Database Administrator’s Guide.
Os hints que so agrupados em mtodos de acesso permitem que o codificador varie o modo como a consulta real
acessada. Esse grupo de hints usado freqentemente, especialmente o hint INDEX. Ele oferece orientao a respeito de
se e como os ndices so usados, e como os ndices correspondentes sero mesclados para chegar resposta final. Os
hints de mtodo de acesso so os seguintes:
AND_EQUALCLUSTERFULL
HASHINDEXINDEX_ASC
INDEX_COMBINEINDEX_DESCINDEX_FFS
INDEX_JOINNO_INDEXRPWID
Este tipo de hint til especialmente em data warehouse em que voc est acostumado com o uso de tabelas de
fato e dimenso. O hint FACT pode forar determinada tabela a ser tabela FACT ou principal para uma consulta. O hint
NO_FACT realiza o oposto. O hint STAR usado apenas para acessar de modo eficaz a tabela FACT na juno de
vrias tabelas. Os hints de transformao da consulta so os seguintes:
FACTMERGENO_EXPAND
NO_FACTNO_MERGENOREWRITE
REWRITESTARUSE_CONCAT
STAR_TRANSFORMATION
DRIVING_SITEHASH_AJHASH_SJ
LEADINGMERGE_AJMERGE_SL
NL_AJNL_SJORDERED
PUSH_SUBQUSE_HASHUSE_MERGE
USE_NL
O agrupamento de execuo paralela aplica-se a bancos de dados usando a opo paralela. Estes hints redefinem a
especificao da tabela para o grau de paralelismo. Os hints de execuo paralela so os seguintes:
NOPARALLELNOPARALLEL_INDEXPARALLEL
PARALLEL_INDEXPQ_DISTRIBUTE
Os hints APPEND e NOAPPEND podem ser usados sem a opo paralela, mas constantemente so usados com ela. O
agrupamento de cach diz respeito aos hints que colocaro itens como usados mais recentemente (CACHE) e usados
menos recentemente (NOCACHE). Os hints so os seguintes:
APPENDCACHECURSOR_SHARING_EXACT
NOAPPENDNO_UNNESTNO_PUSH_PRED
NOCACHEPUSH_PREDORDERED_PREDICATES
UNNEST
Especificando um hint
Se o hint por alguma razo for especificado de forma incorreta, ele se torna um simples comentrio e ser ignorado.
Para evitar este problema, sempre que voc especificar um hint, execute um plano de execuo ou especifique
AUTOTRACE = ON para ver se o hint foi mesmo utilizado.
Sintaxe
Sendo que a tabela na sintaxe acima corresponde a tabela que ser realizada um FULL TABLE SCAN.
Exemplo
From emp
Where deptno = 1;
Sendo que se houvesse um ndice na coluna deptno, um FULL TABLE SCAN seria realizado de forma a ignorar o ndice
e prevalecer o hint.
Veremos os hints mais utilizados por DBAs e desenvolvedores segundo pesquisa informal na TUSC. Detalhes de outros
hints podem ser encontrados na documentao da ORACLE ou em livros especficos deste assunto. A seguir a lista dos
dez mais da TUSC, em ordem de uso:
Voc pode usar mais de um hints de cada vez, embora isso possa fazer com que algum ou todos os hints sejam
ignorados. A sintaxe bsica separar os hints com espaos.
Sintaxe
Sendo que a tabela na sintaxe acima corresponde a tabela que ser realizada um FULL TABLE SCAN e o CACHE.
Exemplo
From emp
Where deptno = 1;
A especificao de vrios hints que entram em conflito entre si faz com que a consulta no use esses hints.
Quando voc usa aliases sobre determinada tabela que deseja usar em um hint, precisa especificar o alias e no o
nome da tabela no hint. Se voc especificar o nome da tabela no hint quando um alias for usado, o hint ser
desconsiderado.
Sintaxe
Este hint utilizado para forar que um ou mais ndices sejam executados para determinada consulta. Voc pode
especificar um ou mais ndices com este hint, e o ORACLE escolher um ou mais ndices especificados com base no
melhor plano de execuo. Caso voc especifique apenas um, o otimizador considerar apenas um ndice.
Sintaxe
Exemplo
From emp
Where deptno = 1;
Este hint faz com que as tabelas sejam acessadas em uma ordem especfica, com base na ordem das tabelas na
clusula FROM da consulta. Ao contrrio do que consta na documentao, ele pode ser usado para a otimizao
baseada em custo ou em regras.
Sintaxe
Exemplo
From emp
Where deptno = 1;
Este hint faz com que consultas FULL SCAN seja divididas em partes ( o grau de paralelismo) e procedam cada parte
com um processo diferente do sistema operacional. A DML paralela s pode ser usada quando voc instala a opo de
particionamento (Partitioning Option) com o seu banco de dados. O Grau de paralelismo aplicado a cada operao de
uma instruo SQL.
possvel especificar o nmero desejado de servidores simultneos que podem ser usados para uma operao paralela.
Pode-se especificar este hint s partes INSERT, UPDATE e DELETE de uma instruo. necessrio que na criao das
tabelas, voc tenha utilizado a clusula parallel.
Sintaxe
O grau o nmero de partes em que a consulta dividida. A instncia (o segundo nmero especificado aps o grau)
o nmero de instncias usadas.
Exemplo
From emp
Este ndice direciona uma consulta para ser otimizada com base na recuperao mais rpida da primeira linha. Este tipo
de ndice muito til quando o desenvolvedor faz uma interface para o usurio que apanha um nico registro no
banco de dados. E seria uma pssima opo para sistemas de relatrios, onde um nmero muito grande de registros
selecionado.
Este ndice ignorado quando utilizamos as instrues UPDATE e DELETE, pois todas as linhas recuperadas sero
atualizadas ou excludas. Tambm ser ignorado quando utilizamos qualquer funo de agrupamento (GROUP BY,
DISTINCT, INTERSECT, MINUS, UNION), pois todas as linhas para o agrupamento precisam ser recuperadas.
Sintaxe
Exemplo
From emp
Where deptno = 1;
Cada hint que emitido causa o uso uso do otimizador baseado em custom, exceto o hint ROLE que faz com que o
otimizador use a otimizao baseada em regra. Isso quer dizer que a distribuio dos dados na tabela e nos ndices no
considerada. Ao invs disto, o otimizador executa a consulta com base em um conjunto de regras predefinidas pelo
ORACLE. Com exceo aos hints DRIVING_SITE e ORDERED, todos os outros hints sero ignorados quando utilizado o
hint RULE.
Sintaxe
Exemplo
From emp
Where deptno = 1;
Este hint instrui a consulta a desconsiderar o otimizador e realizar uma varredura completa da tabela. O hint FULL
possui uma funcionalidade diferente, com base na consulta que voc esta ajustando. Voc pode usa-lo para forar
uma verredura completa quando uma grande parte da tabela estiver sendo consultada. O custo da leitura do ndice e das
linhas pode ser maior do que simplesmente ler a tabela inteira. Este hint pode causar um resultado inesperado. Causar
uma varredura de tabela completa pode fazer com que as tabelas sejam acessadas em uma ordem diferente, pois uma
tabela principal diferente usada. Isso pode gerar um desempenho melhor, fazendo-o pensar que a varredura de
tabela completa foi o benefcio principal, quando a mudana da ordem da tabela principal foi a causa real do melhor
Vestaty Solues em Informtica Ltda
http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49
desempenho.
Sintaxe
Exemplo
From emp
Where deptno = 1;
A medida que a complexidade das consultas aumenta, torna-se mais dificil descobrir a ordem de todas as tabela usando
o hint ORDERED. Voc normalmente pode descobrir qual tabela deve ser acessada primeiro (tabela principal), mas
pode no saber qual tabela acessar depois dessa. A hint LEADING permite que voc especifique uma tabela para
controlar a consulta; o otimizador descobre qual tabela usar depois dela. Se voc especificar mais de uma tabela com
esse hint, ela ser ignorada. O hint ORDERED cancela o hint LEADING.
Sintaxe
Exemplo
and dept.deptno = 1
Este hint normalmente o modo mais rpido de retornar uma nica linha (tempo de resposta); assim, ela
conseqentemente mais lenta no retorno de todas as linhas. Este hint faz com que uma instruo seja processada usando
loops aninhados, que torna a primeira linha combinando de uma tabela, com base no resultado de outra tabela. Isso o
oposto de uma juno por mesclagem, que apanha linhas que correspondem s condies de cada tabela e depois mescla
– isso normalmente leva mais tempo para obter a primeira linha.
Sintaxe
Exemplo
Vestaty Solues em Informtica Ltda
http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49
and dept.deptno = 1
Este hint timo para ser utilizado se voc tiver espao para queimar. Ele no verifica se existe espao dentro dos blocos
atualmente usados para instrues, mas, em vez disso, anexa os dados aos novos blocos. Voc potencialmente poderia
desperdiar espao, mas ganhar velocidade em retorno. Se voc nunca exclui linhas de uma tabela, definitivamente
deve usar APPEND.
Se voc utilizar o carregamento em paralelo com o SQL LOADER, voc ter que usar a opo APPEND. Alm disso,
se um INSERT tiver paralelismo com o hint PARALLEL, APPEND ser utilizado como padro. Voc poder usar o
hint NOAPPEND para cancelar este comportamento.
Sintaxe
Exemplo
values (7747,10);
Este hint normalmente o modo mais rpido de unir muitas linhas de vrias tabelas, se voc tiver memria para esta
operao. USE_HASH semelhante aos loops aninhados, onde o resultado de uma tabela percorrido atravs do
resultado da tabela unida. A diferena aqui que a segunda tabela (aquela sendo percorrida) colocada na memria.
Voc precisa ter um HASH_AREA_SIZE e PGA_AGGREGATE_TARGET grande o bastante para que isto funcione
corretamente, caso contrrio, a operao ocorrera no disco e pode no apresentar uma boa performance.
Sintaxe
Exemplo
Freqentemente descobrimos que um hint no se comporta como gostaramos. As vezes o otimizador cancela o hint, mas
normalmente as pessoas tem um problema relacionado aos seguintes fatos:
Sintaxe incorreta
O hint exige que um parmetro de inicializao seja definido para que funcione
HINTUSO
PARALLELFaz com que as consultas de varredura de tabela completa dividam a consulta em partes e processem cada
parte com um processo diferente
NO_PARALLELDesativa o uso de operaes paralelas em qualquer consulta para uma tabela especificada para usar
operaes paralelas
NOAPPENDVerifica o espao livre dos blocos atuais antes de usar novos blocos
CACHEFaz com que uma varredura de tabela completa seja fixada na memria
NOCACHEFaz com que uma tabela especificada seja colocada em cach no nvel de banco de dados para no ser
colocada em cach quando voc o acessa