Will otimizador Oracle usar várias dicas no mesmo SELECT?
-
05-07-2019 - |
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
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: ...
---------------------------------------------------
...