Vous êtes sur la page 1sur 9

Conhecendo os Hints Oracle

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.

Hints disponveis e agrupamentos

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.

Usando Hints de mtodos de acesso

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

Usando Hints de transformao de consulta

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

Usando Hints de operao e juno

Vestaty Solues em Informtica Ltda


http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49
O agrupamento das operaes de juno mostra como as tabelas unidades mesclam dados. Uma operao de juno, como
USE_MERGE ou USE_HASH, pode ser melhor para apanhar todas as linhas para uma consulta (vazo), enquanto
USE_NL pode ser melhor para apanhar a primeira linha (tempo de resposta). Os hints de operao e juno so os
seguintes:

DRIVING_SITEHASH_AJHASH_SJ

LEADINGMERGE_AJMERGE_SL

NL_AJNL_SJORDERED

PUSH_SUBQUSE_HASHUSE_MERGE

USE_NL

Usando a execuo paralela

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

Usando outros Hints

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

Select /*+ FULL(tabela) */ coluna1, . . .

Sendo que a tabela na sintaxe acima corresponde a tabela que ser realizada um FULL TABLE SCAN.

Exemplo

Vestaty Solues em Informtica Ltda


http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49
Select /*+ FULL(emp) */ empno, ename, deptno

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:

Especificando mltiplos Hints

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

Select /*+ FULL(tabela) CACHE(tabela) */ coluna1, . . .

Sendo que a tabela na sintaxe acima corresponde a tabela que ser realizada um FULL TABLE SCAN e o CACHE.

Exemplo

Select /*+ FULL(emp) CACHE (emp) */ empno, ename, deptno

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.

Usando uma alias

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

Select /*+ FULL(A) */ coluna1, from tabela1 as A

Usando o hint INDEX

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

Select /*+ INDEX (tabela indice1, indice2,...) */ coluna1, . . .


Vestaty Solues em Informtica Ltda
http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49

Exemplo

Select /*+ INDEX (emp deptno_idx) */ empno, ename, deptno

From emp

Where deptno = 1;

Neste exemplo o ndice deptno_idx ser utilizado.

Usando o hint ORDERED

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

Select /*+ ORDERED (tabela indice1, indice2,...) */ coluna1, . . .

Exemplo

Select /*+ INDEX (emp deptno_idx) */ empno, ename, deptno

From emp

Where deptno = 1;

Neste exemplo o ndice deptno_idx ser utilizado.

Usando o hint PARALLEL

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

Select /*+ PARALLEL (tabela, DEGREE, INSTANCES) */ , . . .

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

Select /*+ INDEX (emp deptno_idx) */ empno, ename, deptnob

From emp

Vestaty Solues em Informtica Ltda


http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49
Where deptno = 1;

Neste exemplo o ndice deptno_idx ser utilizado.

Usando o hint FIRST_ROWS

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

Select /*+ FIRST_ROWS (n) */ coluna1, . . .

Exemplo

Select /*+ FIRST_ROWS (10) */ empno, ename, deptno

From emp

Where deptno = 1;

Usando o hint RULE

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

Select /*+ RULE */ coluna1, . . .

Exemplo

Select /*+ RULE */ empno, ename, deptno

From emp

Where deptno = 1;

Usando o hint FULL

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

Select /*+ FULL(tabela) */ coluna1, . . .

Exemplo

Select /*+ FULL(emp) */ empno, ename, deptno

From emp

Where deptno = 1;

Usando o hint LEADING

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

Select /*+ LEADING (tabela1) */ coluna1, . . .

Exemplo

Select /*+ LEADING (DEPT) */ emp.empno, ename, dept.deptno, itemno

From emp, dept, orders

Where emp.deptno = dept.deptno

and emp.empno = orders.empno

and dept.deptno = 1

and emp.empno = 7747

and orders.ordno = 45;

Usando o hint USE_NL

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

Select /*+ USE_NL(tabela indice1, ndice2) */ coluna1, . . .

Exemplo
Vestaty Solues em Informtica Ltda
http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49

Select /*+ USE_NL(dept) */ empno, ename, dept.deptno

From emp, dept

Where emp.deptno = dept.deptno

and dept.deptno = 1

and emp.empno = 7747;

Usando o hint APPEND

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

insert /*+ APPEND*/ …

Exemplo

insert /*+ APPEND */

into emp (empno, deprno)

values (7747,10);

Usando o hint USE_HASH

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

Select /*+ USE_HASH(tabela1) */ coluna1, . . .

Exemplo

Select /*+ USE_HASH(dept) */ empno, ename, dept.deptno

From emp, dept

Where emp.deptno = dept.deptno

and emp.empno = 7747;

Vestaty Solues em Informtica Ltda


http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49
Problemas com hints

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

A tabela no esta analisada (analyze table)

Existe um conflito com outro hint

Voc no esta no modo do otimizador baseado em custo

O hint exige que um parmetro de inicializao seja definido para que funcione

Existe um alias para a tabela e voc utilizou o nome da tabela no hint

O hint exige uma verso diferente da que voc possui

Voc no entende a aplicao correta do hint

Existe um bug no software

Resumos de todos os Hints

HINTUSO

CHOOSEFora a otimizao baseada em custo

RULEFora a otimizao baseada em regra

FIRST_ROWSGeralmente, fora o uso de ndices

ALL_ROWSGeralmente, fora uma varredura de tabela completa

FULLFora uma varredura de tabela completa

INDEXFora o uso de um ndice

NO_INDEXEvita que um ndice especificado seja usado

INDEX_JOINPermite a mistura de ndices de uma nica tabela

INDEX_ASCUsa um ndice classificando em ordem crescente

INDEX_DESCUsa um ndice classificando em ordem decrescente

AND_EQUALAcessa vrios ndices b-tree

INDEX_COMBINEAcessa vrios ndices bitmap

INDEX_FFSFora varreduras completas rapidas

ORDEREDEspecifica a ordem principal das tabelas

LEADINGEspecifica apenas a primeira tabela principal

ORDERED_PREDICATESFora a ordem do predicado

NO_EXPANDAjuda a eliminar a expanso do OR

ROWIDVai para o local fsico exato para pegar a informao

Vestaty Solues em Informtica Ltda


http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49
STARFora um plano de consultas em estrela

DRIVING_SITEProcessa dados apanhando-os de um bloco de dados em particular

USE_MERGEAlterar o modo como as tabelas so unidas internamente

PUSH_SUBQFora a subconsulta a ser processada antecipadamente

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

APPENDAnexa dados em novos blocos

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

CLUSTERFora o agrupamento de clusters

HASHFora o hashing do cluster

CURSOR_SHARING_EXACTCancela a definio de CURSOR_SHARING

Vestaty Solues em Informtica Ltda


http://vestaty.com.br Powered by Joomla! Gerado: 10 June, 2008, 15:49

Vous aimerez peut-être aussi