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é :
- Base de référence du plan SQL - Remplacer un plan par un autre plan.
- 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.
- 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.
- 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.
- 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';
- Contrôle du système - Similaire à ci-dessus mais s'applique à l'ensemble du système.
- 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.
- DBMS_ADVANCED_REWRITE - Changer une requête en une autre requête.
- 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.
- 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é".
- 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.