sql >> Databáze >  >> RDS >> Oracle

Existuje způsob, jak donutit Oracle změnit plán dotazu bez použití nápověd?

Existuje alespoň 11 způsobů, jak ovládat plán bez úpravy dotazu. Níže jsou uvedeny zhruba v pořadí podle užitečnosti:

  1. Základní plán SQL – Nahraďte jeden plán jiným.
  2. Profily SQL - Přidejte do plánů "opravné" rady. Profil může například říkat „toto spojení vrátí 100krát více řádků, než se očekávalo“, což nepřímo změní plán.
  3. Uložená osnova - Myšlenka podobná základnímu plánu SQL, ale s méně funkcemi. Tato možnost je jednodušší na použití, ale méně výkonná a již není podporována.
  4. DBMS_STATS.SET_X_STATS – Ruční úprava statistik tabulek, sloupců a indexů může výrazně změnit plány tím, že objekty budou uměle vypadat více či méně nákladné.
  5. Řízení relace – Například alter session set optimizer_features_enable='11.2.0.3'; . Ne vždy existují užitečné parametry. Ale může pomoci jeden z parametrů OPTIMIZER_* nebo můžete změnit plán pomocí nezdokumentované nápovědy nebo deaktivovat funkci, jako je tato:alter session set "_fix_control"='XYZ:OFF';
  6. Ovládání systému - Podobné jako výše, ale platí pro celý systém.
  7. DBMS_SPD - SQL Plan Direktiva je podobná profilu v tom, že poskytuje některé opravné informace pro optimalizátor. Ale to funguje na nižší úrovni, napříč všemi plány, a je to nové pro 12c.
  8. DBMS_ADVANCED_REWRITE – Změňte dotaz na jiný.
  9. Virtuální soukromá databáze - Změňte dotaz na jiný dotaz přidáním predikátů. Není určen pro výkon, ale pravděpodobně ho můžete zneužít ke změně přístupových cest k indexu.
  10. SQL Translation Framework - Změňte dotaz na jiný dotaz ještě předtím, než bude analyzován. To může umožnit spuštění zcela „nesprávného“ SQL.
  11. Oprava SQL (dbms_sqldiag internal.i_create_patch) - Změňte dotaz na jiný. Podobné jako DBMS_ADVANCED_REWRITE, ale je nezdokumentované a možná o něco výkonnější.



  1. Nelze ověřit, s možností novalidate

  2. Jak to vyřešit v Mysql (#1242 - Poddotaz vrací více než 1 řádek)?

  3. Je toto lomítko ve skriptu Oracle PL/SQL chyba?

  4. Jak připojit Postgres k serveru localhost pomocí pgAdmin na Ubuntu?