Oracle optimizer utilisera-t-il plusieurs indices dans le même SELECT?

j'essaie d'optimiser la performance de la requête et j'ai dû recourir à des conseils d'optimisation. Mais je n'ai jamais appris si l'optimiseur utilise plus d'une allusion à un temps.

e.g.

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;

L'expliquer plan montre le même coût, mais je sais que c'est juste une estimation.

veuillez supposer que toutes les statistiques des tables et des indices ont été calculées. POUR INFO, l'index dcf_vol_prospect_ids_idx est sur l'I. aide-mémoire colonne.

Merci,

Ragoût

18
demandé sur Stew S 2009-01-07 23:38:41

2 réponses

essayez de spécifier tous les indices dans un seul bloc de commentaires, comme indiqué dans cet exemple de la merveilleuse documentation Oracle(http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm).

16.2.1 spécifier un jeu complet d'indices

Lors de l'utilisation d'indicateurs, dans certains cas, vous pourriez avoir besoin de spécifier un ensemble complet de conseils afin d'optimiser la plan d'exécution. Par exemple, si vous avoir une requête très complexe, qui se compose de plusieurs joints de table, et si vous spécifiez seulement L'indice pour un table donnée, alors l'optimiseur a besoin pour déterminer l'accès restant les chemins à utiliser, ainsi que le les méthodes d'assemblage correspondantes. Donc, même si vous avez donné l'indicateur d'INDEX, l'optimiseur peut ne pas nécessairement utiliser l'astuce, car l'optimiseur aurait pu déterminer que le l'index demandé ne peut pas être utilisé les méthodes de jointure et les chemins d'accès sélectionné par la optimiseur.

dans l'exemple 16-1, l'indication principale précise le rejoindre afin d'être les méthodes de jointure à utiliser sur les différents tableaux sont également défini.

exemple 16-1 spécifier un ensemble complet de Conseils

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;
21
répondu Dave Costa 2009-01-07 20:49:58

en fait, la recommandation de Jonathan Lewis, auteur de Cost-Based Oracle Fundamentals est que si le CBO échoue à trouver le bon plan, vous devez prendre en charge le travail du CBO et "layer-in" les conseils - une moyenne de deux conseils par tableau dans la requête.

la raison en est qu'un indice pourrait mener à un autre mauvais et peut-être même pire plan que le CBO obtiendrait sans aide. Si le CBO a tort, vous devez lui donner l'ensemble du plan, pas juste un coup de pouce dans le droit direction.

2
répondu 2009-01-07 22:47:24