sql >> Database teknologi >  >> RDS >> Oracle

Er der en måde at tvinge Oracle til at ændre en forespørgsels plan uden at bruge tip?

Der er mindst 11 måder at styre en plan på uden at ændre forespørgslen. De er angivet nedenfor nogenlunde i rækkefølgen efter brug:

  1. SQL Plan Baseline - Erstat en plan med en anden plan.
  2. SQL-profiler - Tilføj "korrigerende" hints til planerne. En profil kan f.eks. sige "denne deltagelse returnerer 100 gange flere rækker end forventet", hvilket indirekte ændrer planen.
  3. Gemmet disposition - Ligner ideen til SQL Plan Baseline, men med færre funktioner. Denne mulighed er enklere at bruge, men mindre kraftfuld og understøttes ikke længere.
  4. DBMS_STATS.SET_X_STATS - Manuel ændring af tabel-, kolonne- og indeksstatistikker kan ændre planer betydeligt ved at få objekter til at se mere eller mindre dyre ud.
  5. Sessionskontrol - For eksempel alter session set optimizer_features_enable='11.2.0.3'; . Der er ikke altid nyttige parametre. Men en af ​​OPTIMIZER_* parametrene kan hjælpe, eller du kan muligvis ændre planen med et udokumenteret tip eller deaktivere en funktion som denne:alter session set "_fix_control"='XYZ:OFF';
  6. Systemkontrol - Ligner ovenfor, men gælder for hele systemet.
  7. DBMS_SPD - Et SQL-plandirektiv ligner en profil, idet det giver nogle korrigerende oplysninger til optimizeren. Men dette fungerer på et lavere niveau på tværs af alle planer og er nyt for 12c.
  8. DBMS_ADVANCED_REWRITE - Skift en forespørgsel til en anden forespørgsel.
  9. Virtuel privat database - Skift en forespørgsel til en anden forespørgsel ved at tilføje prædikater. Det er ikke beregnet til ydeevne, men du kan sikkert misbruge det til at ændre indeksadgangsstier.
  10. SQL Translation Framework - Skift en forespørgsel til en anden forespørgsel, før den overhovedet bliver parset. Dette kan gøre det muligt at køre helt "forkert" SQL.
  11. SQL-patch (dbms_sqldiag internal.i_create_patch) - Skift en forespørgsel til en anden forespørgsel. Svarer til DBMS_ADVANCED_REWRITE, men det er udokumenteret og måske en smule mere kraftfuldt.



  1. Oracle Floats vs Number

  2. Tidsforskel mellem pr. person mellem på hinanden følgende rækker

  3. hvordan kan jeg kontrollere fremmednøglebegrænsning ved sletningsbegrænsning ved hjælp af PHP

  4. Hvordan reducerer man resultatrækker af SQL-forespørgsler lige meget i hele spektret?