Wird Oracle Optimierer mehrere Hinweise in der gleichen SELECT verwenden?
-
05-07-2019 - |
Frage
Ich versuche, die Abfrageleistung zu optimieren und haben zur Verwendung von Optimierungshinweise greifen musste. Aber ich habe nie gelernt, wenn der Optimierer mehr als einen Hinweis zu einer Zeit verwendet wird.
z.
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;
Der Plan erläutern zeigt die gleichen Kosten, aber ich weiß, das ist nur eine Schätzung.
Gehen Sie davon aus, dass alle Tabellen- und Indexstatistiken berechnet wurden. FYI, ist der Index dcf_vol_prospect_ids_idx auf der i.solicitor_id Spalte.
Danke,
Stew
Lösung
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 ).
16.2.1 eine ganze Reihe von Tipps Angabe
Wenn Hinweise verwenden, in einigen Fällen Sie Möglicherweise müssen Sie einen vollständigen Satz von angeben Hinweise, um die optimale, um sicherzustellen, Ausführungsplan. Zum Beispiel, wenn Sie haben eine sehr komplexe Abfrage, die besteht aus vielen Tabellen-Joins, und wenn geben Sie nur den INDEX-Hinweis für eine gegebene Tabelle, dann der Optimierungsbedarf den verbleibenden Zugang zu bestimmen Wege wie die verwendet werden, sowie zu entsprechende Verfahren beizutreten. Deshalb, obwohl Sie die INDEX-Hinweis gab, das Optimierungsprogramm möglicherweise nicht notwendigerweise verwenden Sie diesen Hinweis, da der Optimierer könnte, dass die bestimmt angeforderte Index kann nicht wegen verwendet werden die Verknüpfungsmethoden und Zugriffspfade vom Optimierungsprogramm ausgewählt.
In Beispiel 16-1, der weltweit führenden Hinweis spezifiziert verbinden die genaue Reihenfolge zu sein benutzt; die Join-Methoden verwendet werden soll die verschiedenen Tabellen sind auch angegeben.
Beispiel 16-1 Angeben eines vollständigen Satz von Hinweise
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;
Andere Tipps
In der Tat, die Empfehlung von Jonathan Lewis, Autor von kostenbasierten Oracle Fundamentals ist, dass, wenn die CBO des richtigen Plan zu finden, fehlschlägt, müssen Sie über den Job des CBO und „Schicht-in“ die Hinweise aufzunehmen - ein Durchschnitt von zwei Hinweisen pro Tabelle in der Abfrage.
Der Grund dafür ist, dass ein Hinweis auf noch einen anderen schlecht führen könnte und möglicherweise sogar schlechten Plan als die CBO ohne fremde Hilfe bekommen würde. Wenn das CBO falsch ist, müssen Sie ihm den ganzen Plan geben, nicht nur einen Schub in der richtigen Richtung.
Oracle 19c eingeführt Hinweis Usage Reporting-Funktion :
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'));
--============
Es zeigt einen weiteren Abschnitt Hint Report
:
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: ...
---------------------------------------------------
...