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

War es hilfreich?

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: ...
---------------------------------------------------
...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top