Pergunta

Eu estou tentando o desempenho da consulta otimizar e tiveram que recorrer ao uso de dicas de otimização. Mas eu nunca soube se o otimizador irá utilizar mais do que uma dica de uma vez.

por exemplo.

SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/
       /*+ LEADING(i vol) */ 
       /*+ ALL_ROWS */ 
       i.id_number,
       ...
  FROM i_table i
  JOIN vol_table vol on vol.id_number = i.id_number
  JOIN to_a_bunch_of_other_tables...
 WHERE i.solicitor_id = '123'
   AND vol.solicitable_ind = 1;

A explicar plano mostra o mesmo custo, mas eu sei que é apenas uma estimativa.

Por favor, assumir que todas as estatísticas de tabelas e índices foram calculados. FYI, o dcf_vol_prospect_ids_idx índice é na coluna i.solicitor_id.

Obrigado,

Stew

Foi útil?

Solução

Tente especificar todas as dicas em um único bloco de comentário, como mostrado neste exemplo da documentação maravilhoso Oracle ( http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm ).

16.2.1 Especificando um conjunto completo de dicas

Ao usar dicas, em alguns casos, você Talvez seja necessário especificar um conjunto completo de dicas, a fim de garantir a óptima plano de execução. Por exemplo, se você tem uma consulta muito complexa, que consiste em muitas junções de tabela, e se especificar apenas a dica INDEX para um determinada tabela, em seguida, as necessidades do otimizador para determinar o acesso restantes caminhos para ser utilizado, bem como o correspondente métodos de junção. Portanto, mesmo que você deu a dica INDEX, o otimizador pode não ser necessariamente usar essa dica, porque o otimizador pode ter determinado que o índice solicitado não pode ser usado devido à a juntar-se métodos e vias de acesso selecionado pelo otimizador.

No Exemplo 16-1, a dica CONDUZINDO especifica a exata juntar a fim de ser usava; Os métodos a serem usados ??em juntar-se as diferentes tabelas também são especificado.

Exemplo 16-1 Especificando um conjunto completo de Sugestões

SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk)
           USE_MERGE(j) FULL(j) */
    e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal  
FROM employees e1, employees e2, job_history j
WHERE e1.employee_id = e2.manager_id
  AND e1.employee_id = j.employee_id
  AND e1.hire_date = j.start_date
GROUP BY e1.first_name, e1.last_name, j.job_id   ORDER BY total_sal;

Outras dicas

Na verdade, a recomendação de Jonathan Lewis, autor de custos baseado em da Oracle Fundamentals é que se o CBO falhar em encontrar o plano correto, você precisa assumir o trabalho da CBO e "camada-in" as dicas - uma média de duas dicas por tabela na consulta.

A razão é que uma dica poderia levar a mais um mau e um plano possivelmente até mesmo pior do que o CBO iria ficar nu. Se o CBO é errado, você precisa dar-lhe todo o plano, não apenas de um empurrãozinho na direção certa.

A Oracle 19c introduzido recurso Relatório de Uso Dica :

EXPLAIN PLAN FOR
SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/
       /*+ LEADING(i vol) */ 
       /*+ ALL_ROWS */ 
       i.id_number,
       ...
  FROM i_table i
  JOIN vol_table vol on vol.id_number = i.id_number
  JOIN to_a_bunch_of_other_tables...
 WHERE i.solicitor_id = '123'
   AND vol.solicitable_ind = 1;

SELECT * FROM table(DBMS_XPLAN.DISPLAY(FORMAT=>'BASIC +HINT_REPORT'));
                                                     --============

Ela mostra um outro Hint Report seção:

Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: ...
---------------------------------------------------
...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top