2009-01-07 2 views
15

J'essaie d'optimiser les performances des requêtes et j'ai dû utiliser des indicateurs d'optimisation. Mais je n'ai jamais appris si l'optimiseur utilisera plus d'un indice à la fois.L'optimiseur Oracle utilisera-t-il plusieurs astuces dans le même SELECT?

par exemple. Le plan d'explication montre le même coût, mais je sais que c'est juste une estimation.

Veuillez supposer que toutes les statistiques de table et d'index ont été calculées. Pour info, l'index dcf_vol_prospect_ids_idx est sur la colonne i.solicitor_id.

Merci,

Ragoût

Répondre

19

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

16.2.1 Spécification d'un jeu complet des Conseils

Lorsque vous utilisez des notes, dans certains cas, vous devrez peut-être de spécifier un ensemble complet de conseils afin d'assurer le optimal plan d'exécution. Par exemple, si vous avez une question très complexe, qui se compose de plusieurs jointures de table, et si vous ne spécifiez que l'indicateur INDEX pour une table donnée , l'optimiseur a besoin pour déterminer l'accès restant chemins à utiliser , ainsi que les méthodes de jointure correspondantes . Par conséquent, même si vous avez donné l'indice INDEX, l'optimiseur peut-être pas nécessairement utiliser ce soupçon, car l'optimiseur aurait déterminé que l'indice demandé ne peut pas être utilisé en raison de la jointure des méthodes et des chemins d'accès sélectionnés par la optimiseur. Dans l'exemple 16-1, l'indicateur LEADING spécifie l'ordre de jointure exact utilisé; les méthodes de jointure à utiliser sur les différentes tables sont également spécifiées.

Exemple 16-1 Spécification d'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; 
+0

Si quelqu'un s'en soucie, j'ai essayé ceci et le plan d'explication a donné le même coût qu'avant. Qui sait si le CBO va vraiment l'utiliser! : -/ –

+0

Dave, J'ai certains RTFMed ce chapitre, mais jamais tombé sur ce bon exemple. Désolé pour le poste stupide; J'essaie vraiment de ne pas faire ça!: -/ Merci, Ragoût –

2

En fait, la recommandation de Jonathan Lewis, auteur de Fundamentals Oracle est basée sur les coûts que si le CBO échoue à trouver le bon plan, vous devez prendre en charge le travail de l'OBC et "couche-dans" les conseils - une moyenne de deux indices par table dans la requête.

La raison en est qu'un indice pourrait conduire à un autre mauvais plan et peut-être même pire que le CBO ne serait aidé. Si le CBO est mauvais, vous devez lui donner le plan entier, pas seulement un coup de pouce dans la bonne direction.

+0

> Si le CBO est mal Cela semble être un assez grand si, non? :-) Point intéressant cependant. D'après ce que j'ai lu sur Tom Kyte, il recommande de faire tout le possible avant d'utiliser Hints. –

+1

TOTALEMENT d'accord. Mais le CBO peut et aura tort. Aucun code complexe ne pourrait jamais espérer être parfait. Je suis un dévot des TK et il a raison. Sans parler du fait que 90% des programmeurs et des administrateurs de bases de données ne savent pas quand le CBO a tort et qu'on lui ment. –

Questions connexes