Zal Oracle optimizer gebruik van meerdere Tips op dezelfde SELECTEREN?

Ik ben het optimaliseren van de prestaties van query en moest toevlucht tot het gebruik van optimizer hints. Maar ik heb nooit geleerd als de optimizer zal gebruik maken van meer dan één hint op een moment.

bijvoorbeeld

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;

Het uitleggen plan geeft dezelfde kosten, maar ik weet dat dat slechts een schatting.

U kunt ervan uitgaan dat alle tafel en index statistieken zijn berekend. FYI, de index dcf_vol_prospect_ids_idx is op de i.solicitor_id kolom.

Bedankt,

Stoofpot

InformationsquelleAutor Stew S | 2009-01-07



3 Replies
  1. 22

    Probeer het opgeven van alle tips in een enkele opmerking blok, zoals in dit voorbeeld van de prachtige documentatie van Oracle (http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm).

    16.2.1 het Opgeven van een Volledige Set van Tips

    Bij het gebruik van hints, in sommige gevallen, u
    misschien moet opgeven van een volledige set van
    tips om te zorgen voor het optimale
    uitvoering plan. Bijvoorbeeld, als u
    een zeer complexe query
    bestaat uit tal van tabel-joins, en als
    geeft u alleen de INDEX hint voor een
    gegeven tabel, dan is de optimizer behoeften
    voor het bepalen van de resterende toegang
    paden om te worden gebruikt, alsmede de
    overeenkomstige mee methoden. Daarom
    ook al gaf je de INDEX hint,
    de optimizer niet noodzakelijk
    gebruik van deze tip, omdat de optimizer
    zouden hebben bepaald dat de
    gevraagde index niet gebruikt kan worden door
    de join-methoden en wegen
    geselecteerd door de optimizer.

    In Voorbeeld 16-1, de TOONAANGEVENDE hint
    hiermee geeft u de exacte join-volgorde te zijn
    gebruikt; het deelnemen aan methoden om gebruikt te worden op
    de verschillende tabellen zijn ook
    opgegeven.

    Voorbeeld 16-1 het Opgeven van een Volledige Set van
    Tips

    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;
    • Als iemand cares, ik heb dit geprobeerd en het Uitleggen van Plan gaf dezelfde prijs als voorheen. Wie weet of het CBO zal daadwerkelijk te gebruiken! :-/
    • Dave, ik heb bepaalde RTFMed dat hoofdstuk, maar nooit struikelde over dat grote voorbeeld. Sorry voor de domme post; ik echt proberen dat niet te doen! :-/ Bedankt, Stoofpot
  2. 2

    In feite, de aanbeveling van Jonathan Lewis, de Auteur van de Kosten op Basis van Oracle Fundamentals is dat als de CBO faalt bij het vinden van het juiste plan, moet u de taak overnemen van het CBO en “laag-in” van de tips – een gemiddelde van twee tips per tabel in de query.

    De reden is dat een hint zou kunnen leiden tot nog een andere slechte en misschien zelfs slechter plan dan het CBO zou krijgen zonder hulp. Als het CBO is verkeerd, je moet om het hele plan, niet alleen een duwtje in de goede richting.

    • > Als het CBO is verkeerd, Dat lijkt vrij groot, zo niet? 🙂 Interessant punt wel. Van wat ik heb gelezen van Tom Kyte, beveelt hij doet alles wat mogelijk is voordat je gebruik maken van Hints.
    • HELEMAAL mee eens. Maar de CBO kan en ZAL verkeerd zijn. Geen code die complexe ooit konden hopen om perfect te zijn. Ik ben een TK toegewijde en hij heeft gelijk. Niet te vergeten dat 90% van ontwikkelaars en DBA ‘ s niet weten wanneer de CBO is eigenlijk verkeerd en het is gewoon gelogen.
  3. 2

    Oracle 19c geïntroduceerd Tip Gebruik de Rapportage functie:

    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'));
                                                         --============

    Het toont een ander deel Hint Report:

    Hint Report (identified by operation id / Query Block Name / Object Alias):
    Total hints for statement: ...
    ---------------------------------------------------
    ...

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *