sql >> Database >  >> RDS >> Oracle

Is er een manier om Oracle te dwingen het plan van een query te wijzigen zonder hints te gebruiken?

Er zijn minstens 11 manieren om een ​​plan te beheren zonder de query te wijzigen. Ze worden hieronder ruwweg weergegeven in volgorde van bruikbaarheid:

  1. SQL-planbasislijn - Vervang het ene abonnement door een ander abonnement.
  2. SQL-profielen - Voeg "corrigerende" hints toe aan de plannen. Een profiel kan bijvoorbeeld zeggen "deze join levert 100 keer meer rijen op dan verwacht", wat indirect het plan verandert.
  3. Opgeslagen overzicht - Idee vergelijkbaar met SQL Plan Baseline, maar met minder functies. Deze optie is eenvoudiger te gebruiken, maar minder krachtig en wordt niet meer ondersteund.
  4. DBMS_STATS.SET_X_STATS - Het handmatig wijzigen van tabel-, kolom- en indexstatistieken kan plannen aanzienlijk veranderen door objecten er kunstmatig meer of minder duur uit te laten zien.
  5. Sessiecontrole - Bijvoorbeeld alter session set optimizer_features_enable='11.2.0.3'; . Er zijn niet altijd nuttige parameters. Maar een van de OPTIMIZER_* parameters kan helpen, of u kunt het plan wijzigen met een ongedocumenteerde hint of een functie als deze uitschakelen:alter session set "_fix_control"='XYZ:OFF';
  6. Systeembeheer - Gelijkaardig aan hierboven, maar van toepassing op het hele systeem.
  7. DBMS_SPD - Een SQL-planrichtlijn is vergelijkbaar met een profiel omdat het wat corrigerende informatie aan de optimizer geeft. Maar dit werkt op een lager niveau, voor alle abonnementen, en is nieuw voor 12c.
  8. DBMS_ADVANCED_REWRITE - Verander een zoekopdracht in een andere zoekopdracht.
  9. Virtuele privédatabase - Verander een zoekopdracht in een andere zoekopdracht door predikaten toe te voegen. Het is niet bedoeld voor prestaties, maar u kunt het waarschijnlijk misbruiken om indextoegangspaden te wijzigen.
  10. SQL-vertaalkader - Verander een query in een andere query, voordat deze zelfs maar wordt geparseerd. Hierdoor kan een totaal "verkeerde" SQL worden uitgevoerd.
  11. SQL-patch (dbms_sqldiag internal.i_create_patch) - Verander een zoekopdracht in een andere zoekopdracht. Vergelijkbaar met DBMS_ADVANCED_REWRITE, maar het is niet gedocumenteerd en misschien een beetje krachtiger.



  1. Som de waarden van een kolom op op basis van een groep waarden uit een andere kolom

  2. Het Halloween-probleem - Deel 3

  3. MySQL:door komma's gescheiden lijst in meerdere rijen splitsen

  4. Het datamodel voor belangrijke data