Você está na página 1de 7

CONHECENDO HINTS Mesmo sabendo que o otimizador incrivelmente preciso na escolha do camin ho de otimizao correto e no uso de ndices para

a milhares de consultas no seu sistema , ele no perfeito. O ORACLE possui hints (sugestes) que voc poder usar para determinad as 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 i nstruo especfica. O parmetro OPTIMIZER_MODE de init.ora pode ser usado para modifica r todas as instrues no banco de dados para que sigam um caminho de execuo especfico, ma s 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 ta belas no tiverem sido analisadas. Hints disponveis e agrupamentos Os hints disponveis variam de acordo com a verso do banco de dados instala do. 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 v arie o modo como a consulta real acessada. Esse grupo de hints usado freqentement e, 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_EQUAL HASH INDEX_COMBINE INDEX_JOIN CLUSTER INDEX INDEX_DESC NO_INDEX FULL INDEX_ASC INDEX_FFS RPWID

Usando Hints de transformao de consulta Este tipo de hint til especialmente em data warehouse em que voc est acostu mado 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: FACT NO_FACT REWRITE STAR_TRANSFORMATION MERGE NO_MERGE STAR NO_EXPAND NOREWRITE USE_CONCAT

Usando Hints de operao e juno O agrupamento das operaes de juno mostra como as tabelas unidades mesclam da dos. 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_SITE LEADING NL_AJ PUSH_SUBQ USE_NL Usando a execuo paralela

HASH_AJ MERGE_AJ NL_SJ USE_HASH

HASH_SJ MERGE_SL ORDERED USE_MERGE

O agrupamento de execuo paralela aplica-se a bancos de dados usando a opo pa ralela. Estes hints redefinem a especificao da tabela para o grau de paralelismo. Os hints de execuo paralela so os seguintes: NOPARALLEL PARALLEL_INDEX Usando outros Hints Os hints APPEND e NOAPPEND podem ser usados sem a opo paralela, mas consta ntemente so usados com ela. O agrupamento de cache diz respeito aos hints que colocaro itens como usados mais recentemente (CACHE) e usados menos recentemente (NOCACHE). Os hints so os seguintes: APPEND NOAPPEND NOCACHE UNNEST Especificando um hint Se o hint por alguma razo for especificado de forma incorreta, ele se tor na 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 realizad a um FULL TABLE SCAN. Exemplo 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 inf ormal na TUSC. Detalhes de outros hints podem ser encontrados na documentao da ORA CLE 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 q ue algum ou todos os hints sejam ignorados. A sintaxe bsica separar os hints com espaos. Sintaxe CACHE NO_UNNEST PUSH_PRED CURSOR_SHARING_EXACT NO_PUSH_PRED ORDERED_PREDICATES NOPARALLEL_INDEX PQ_DISTRIBUTE PARALLEL

Select /*+ FULL(tabela) CACHE(tabela) */ coluna1, . . . Sendo que a tabela na sintaxe acima corresponde a tabela que ser realizad a 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 hin t, 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, . . . 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 con sta 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 g rau de paralelismo) e procedam cada parte com um processo diferente do sistema o peracional. A DML paralela s pode ser usada quando voc instala a opo de particionamento (Partiti

oning 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 se r 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 utili o 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 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 s eria 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 tod as as linhas recuperadas sero atualizadas ou excludas. Tambm ser ignorado quando utilizamos qualquer funo de agrupamento (GROUP BY, DISTINCT, INTERSECT, MIN US, 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, e xceto 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 out ros 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 complet a 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. Es te hint pode causar um resultado inesperado. Causar uma varredura de tabela comp leta 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 pens ar que a varredura de tabela completa foi o benefcio principal, quando a mudana da ordem da tabela principal foi a causa real do melhor 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 tabe la 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 ca ncela 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 torn a a primeira linha combinando de uma tabela, com base no resultado de outra tabe la. Isso o oposto de uma juno por mesclagem, que apanha linhas que correspondem s condie 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 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 ve rifica se existe espao dentro dos blocos atualmente usados para instrues, mas, em vez disso, anexa os dados aos novos blocos. Voc potencialmente poderia desperd iar espao, mas ganhar velocidade em retorno. Se voc nunca exclui linhas de uma tabel a, definitivamente deve usar APPEND. Se voc utilizar o carregamento em paralelo com o SQL LOADER, voc ter que us ar 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 c omportamento. 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 q ue 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; Problemas com hints Freqentemente descobrimos que um hint no se comporta como gostaramos. As ve zes 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 HINT USO CHOOSE Fora a otimizao baseada em custo RULE Fora a otimizao baseada em regra FIRST_ROWS Geralmente, fora o uso de ndices ALL_ROWS Geralmente, fora uma varredura de tabela completa FULL Fora uma varredura de tabela completa INDEX Fora o uso de um ndice NO_INDEX Evita que um ndice especificado seja usado INDEX_JOIN Permite a mistura de ndices de uma nica tabela INDEX_ASC Usa um ndice classificando em ordem crescente INDEX_DESC Usa um ndice classificando em ordem decrescente AND_EQUAL Acessa vrios ndices b-tree INDEX_COMBINE Acessa vrios ndices bitmap INDEX_FFS Fora varreduras completas rapidas ORDERED Especifica a ordem principal das tabelas LEADING Especifica apenas a primeira tabela principal ORDERED_PREDICATES Fora a ordem do predicado NO_EXPAND Ajuda a eliminar a expanso do OR ROWID Vai para o local fsico exato para pegar a informao STAR Fora um plano de consultas em estrela DRIVING_SITE Processa dados apanhando-os de um bloco de dados em particular USE_MERGE Alterar o modo como as tabelas so unidas internam ente PUSH_SUBQ Fora a subconsulta a ser processada antecipadamen te PARALLEL Faz com que as consultas de varredura de tabela completa dividam a consulta em partes e processem cada parte com um processo dif erente NO_PARALLEL Desativa o uso de operaes paralelas em qualquer co nsulta para uma tabela especificada para usar operaes paralelas APPEND Anexa dados em novos blocos NOAPPEND Verifica o espao livre dos blocos atuais antes de usar novos blocos CACHE Faz com que uma varredura de tabela completa sej a fixada na memria NOCACHE Faz com que uma tabela especificada seja colocad a em cach no nvel de banco de dados para no ser colocada em cach quando voc o acessa CLUSTER Fora o agrupamento de clusters HASH Fora o hashing do cluster CURSOR_SHARING_EXACT Cancela a definio de CURSOR_SHARING

Você também pode gostar