La méthode n’est pas très orthodoxe, convenons-en. Elle permet d’introduire des hints sur des requêtes, ce qui, très souvent est le contraire d’une bonne idée. Elle le fait grâce à un SQL profile au lieu d’un Outline ou d’une baseline SQL Plan Management qui sont les outils faits pour ça. Enfin, elle n’est pas documentée donc non supportée.
Et pourtant, il y a quelques semaines, j’ai démontré l’intérêt d’une préconisation sur un plan en utilisant un SQL Profile. En fait il s’agissait d’introduire un niveau supplémentaire de « dynamic sampling » sur une requête sans toucher aux paramètres d’instance ou de session. Cette approche est intéressante à plusieurs égards :
- D’abord, elle permet de le faire même si
cursor_sharing=exact
et que vos requêtes ont des valeurs littérales qui changent, grâce au paramètreforce_match
- Ensuite, elle ne fixe pas le plan mais permet d’ajouter uniquement certains hints bien choisis comme
dynamic_sampling
,gather_plan_statistics
oumonitor
- Enfin, elle vous permet de le faire sans toucher au code
Mais rendons à César… Le script dont il s’agit est disponible sur Internet. Il appartient à Kerry Osborne, lequel à un blog avec quelques articles exceptionnels. Il s’appuie essentiellement sur :
- La procédure
dbms_sqltune.import_sql_profile
, non documentée, qui permet de créer un profile SQL à partir du texte d’une requête - Le type
sqlprof_attr
qui permet d’ajouter (via le paramètreprofile
), les hints de votre choix comme paramètres du SQL profile - La capacité que vous aurez de retrouver le texte d’une requête dans la shared_pool… ou à l’endroit de votre choix (AWR, Statspack, votre code)
Pour créer un SQL Profile, définissez les paramètres sql_id
, profile_name
, category
, force_matching
et hint
et vous pourrez le voir utilisé dans la section « note » du plan d’exécution une fois celui-ci re-parsé.
Dans mon cas, nous avons fini par modifier le code du batch concerné avec l’aide des développeurs. Toutefois, nous avons gagné plusieurs heures en corrigeant le plan sur les environnements de tests avant de nous retourner vers une autre équipe. Je me suis dit que quelques-uns d’entre-vous qui n’ont pas encore eu la chance de croiser ces articles aimeraient y jeter un œil. Quelqu’un a dit intéressant ?