Oracle
 sql >> Base de données >  >> RDS >> Oracle

Existe-t-il un moyen de forcer Oracle à modifier le plan d'une requête sans utiliser d'indices ?

Il existe au moins 11 façons de contrôler un plan sans modifier la requête. Ils sont listés ci-dessous à peu près dans l'ordre d'utilité :

  1. Base de référence du plan SQL - Remplacer un plan par un autre plan.
  2. Profils SQL - Ajouter des indices "correctifs" aux plans. Par exemple, un profil peut indiquer "cette jointure renvoie 100 fois plus de lignes que prévu", ce qui modifie indirectement le plan.
  3. Contour stocké - Semblable dans l'idée à SQL Plan Baseline, mais avec moins de fonctionnalités. Cette option est plus simple à utiliser mais moins puissante et n'est plus prise en charge.
  4. DBMS_STATS.SET_X_STATS - La modification manuelle des statistiques de table, de colonne et d'index peut modifier considérablement les plans en rendant artificiellement les objets plus ou moins chers.
  5. Contrôle des sessions - Par exemple alter session set optimizer_features_enable='11.2.0.3'; . Il n'y a pas toujours de paramètres utiles. Mais l'un des paramètres OPTIMIZER_* peut vous aider, ou vous pourrez peut-être modifier le plan avec un indice non documenté ou désactiver une fonctionnalité comme celle-ci :alter session set "_fix_control"='XYZ:OFF';
  6. Contrôle du système - Similaire à ci-dessus mais s'applique à l'ensemble du système.
  7. DBMS_SPD - Une directive de plan SQL est similaire à un profil en ce sens qu'elle fournit des informations correctives à l'optimiseur. Mais cela fonctionne à un niveau inférieur, dans tous les forfaits, et c'est nouveau dans la version 12c.
  8. DBMS_ADVANCED_REWRITE - Changer une requête en une autre requête.
  9. Base de données privée virtuelle - Changer une requête en une autre requête, en ajoutant des prédicats. Il n'est pas destiné à la performance, mais vous pouvez probablement en abuser pour modifier les chemins d'accès aux index.
  10. Cadre de traduction SQL - Changez une requête en une autre requête, avant même qu'elle ne soit analysée. Cela peut permettre l'exécution d'un code SQL totalement "erroné".
  11. Correctif SQL (dbms_sqldiag internal.i_create_patch) - Changer une requête en une autre requête. Similaire à DBMS_ADVANCED_REWRITE mais non documenté et peut-être un peu plus puissant.