2009-01-07 13 views
15

Ich versuche, die Abfrageleistung zu optimieren und musste auf Optimizer-Hinweise zurückgreifen. Aber ich habe nie erfahren, ob der Optimierer mehr als einen Hinweis gleichzeitig verwendet.Wird der Oracle-Optimierer mehrere Hinweise in demselben SELECT verwenden?

z.B.

Der EXPLAIN-Plan zeigt die gleichen Kosten, aber ich weiß, das ist nur eine Schätzung.

Bitte gehen Sie davon aus, dass alle Tabellen- und Indexstatistiken berechnet wurden. Zu Ihrer Information: Der Index dcf_vol_prospect_ids_idx befindet sich in der Spalte i.solicitor_id.

Danke,

Stew

Antwort

19

Versuchen Sie, alle Hinweise in einem einzigen Kommentarblock spezifiziert, wie in diesem Beispiel von der wunderbaren Oracle-Dokumentation (http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm) gezeigt.

16.2.1 eine ganze Reihe von Tipps Angeben

Wenn Hinweise verwenden, in einigen Fällen Sie könnten eine ganze Reihe von Hinweisen, um den optimalen Ausführungsplan, um sicherzustellen, angeben. Zum Beispiel, wenn Sie eine sehr komplexe Abfrage haben , die besteht aus vielen Tabellen-Joins, und wenn Sie nur den INDEX-Hinweis für eine gegebene Tabelle angeben, dann wird der Optimierer muss den verbleibenden Zugang Pfade bestimmen, verwendet werden sollte sowie die entsprechenden Join-Methoden . Daher obwohl gab dir die INDEX-Hinweis, das Optimierungsprogramm möglicherweise nicht unbedingt Gebrauch, die andeuten, da der Optimierer haben festgestellt, möglicherweise, dass der angeforderte Index nicht aufgrund die Join-Methoden verwendet werden können und Zugriffspfade durch die ausgewählte Optimierer.

In Beispiel 16-1 gibt der LEADING-Hinweis die genaue Verknüpfungsreihenfolge an, die verwendet werden soll; Die bei zu verwendenden Join-Methoden die verschiedenen Tabellen sind auch angegeben.

Beispiel 16-1 einen vollständigen Satz von Hinweisen

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

Wenn es jemanden interessiert, habe ich das versucht und der Explain Plan gab die gleichen Kosten wie zuvor. Wer weiß, ob das CBO es tatsächlich benutzt! : -/ –

+0

Dave, Ich habe sicher dieses Kapitel RTFMed, aber nie über dieses großartige Beispiel gestolpert. Entschuldigung für die dumme Post; Ich versuche es wirklich nicht!: -/ Danke, Stew –

2

In der Tat angeben, die Empfehlung von Jonathan Lewis, Autor von kostenbasierten Oracle Fundamentals ist, dass, wenn die CBO nicht die richtigen zu finden, Plan, Sie müssen die Aufgabe des CBO übernehmen und die Hinweise "einlagern" - durchschnittlich zwei Hinweise pro Tabelle in der Abfrage.

Der Grund ist, dass ein Hinweis zu einem weiteren schlechten und möglicherweise sogar schlechteren Plan führen könnte, als der CBO ohne Hilfe erhalten würde. Wenn der CBO falsch ist, müssen Sie ihm den ganzen Plan geben, nicht nur einen Schub in die richtige Richtung.

+0

> Wenn das CBO falsch ist das scheint wie ein ziemlich groß, wenn nicht? :-) Interessanter Punkt obwohl. Nach dem, was ich über Tom Kyte gelesen habe, empfiehlt er, alles Mögliche zu tun, bevor Sie Hinweise verwenden. –

+1

TOTAL stimmen zu. Aber das CBO kann und wird falsch sein. Kein Code, den der Komplex jemals hoffen könnte, perfekt zu sein. Ich bin ein TK-Anhänger und er hat Recht. Ganz zu schweigen davon, dass 90% der Programmierer und DBAs nicht wissen, wann der CBO wirklich falsch ist und nur belogen wird. –