Digora blog

Comment expliquer les caprices de l'optimiseur Oracle et y faire face - partie 1

20/08/2012
Données

Comme les autres SGBD, Oracle utilise un optimiseur permettant de dĂ©finir un plan d'exĂ©cution des ordres SQL.  L'optimiseur d'Oracle est rĂ©putĂ© pour rĂ©aliser des prodiges de performances... sauf dans certains cas, non prĂ©visibles. Ce premier article d'une sĂ©rie a pour but de faire un point sur ce sujet important, en posant les bases d'abord...

1. Introduction

Voici quelques faits Ă  prendre en compte :

  • L'exĂ©cution d'un ordre SQL nĂ©cessite un plan d'exĂ©cution (dans quel ordre et de quelle façon Oracle va accĂ©der aux tables)
  • L'optimiseur Oracle gĂ©nère et sĂ©lectionne ce plan
  • Il existe deux approches d'optimisation
    • Optimisation basĂ©e sur les règles (Rule Based Optimization = RBO); cette mĂ©thode n'est plus supportĂ©e par Oracle depuis quelques version
    • Optimisation basĂ©e sur les coĂ»ts (Cost Based Optimization  = CBO)
  • La performance dĂ©pend du plan choisi
  • Un plan peut s'avĂ©rer plus performant qu'un autre
  • Occasionnellement, un plan moins bon est choisi

D'où cette question légitime : comment empêcher l'optimiseur de choisir le "mauvais plan d'exécution" ?

2. Les plans d'exécution

Les plans d'exécutions sont générés par l'optimiseur en fonction

  • de l'ordre SQL envoyĂ© Ă  Oracle
  • des objets prĂ©sents dans le schĂ©ma Oracle (tables, index, etc...)

De plus, si l'optimiseur basé sur les coûts est utilisé (CBO), sont également pris en compte

  • les paramètres Système d'Oracle
  • les paramètres Session d'Oracle
  • les statistiques des objets Oracle (tables et index)
  • les statistiques du système informatique utilisĂ© (temps de recherche d'un bloc sur disque, temps de transfert entre les disques et la mĂ©moire, vitesse de la CPU, etc...)
  • divers autres critères
Voici une requĂŞte SQL :
SELECT e.employee_id, j.job_title, e.salary, d.department_name
    FROM employees e, jobs j, departments d
    WHERE  e.employee_id < 103
       AND e.job_id = j.job_id 
       AND e.department_id = d.department_id;
et son plan d'exécution associé : l'ordre des opérations est indiqué : 1), 2), ... 8):
Plan d'exécution requête SQL

3. Pourquoi un plan d'exécution peut-il changer ?

Un plan d'exécution peut changer si :

  • les objets du schĂ©ma changent (ajout ou suppression d'index, etc...)
  • la version d'Oracle est diffĂ©rente (ex. mise  Ă  jour)

De plus, si l'optimiseur basé sur les coûts est utilisé (CBO), il existe d'autres causes de changement de plan d'exécution :

  • changements des paramètres Système de la base ou l'instance Oracle
  • changements des paramètres de la session Oracle
  • changements dans les statistiques objets (nombre de lignes d'une table, histogrammes, etc...)
  • changements dans les statistiques système  (temps de recherche d'un bloc sur disque, temps de transfert entre les disques et la mĂ©moire, vitesse de la CPU, etc...)

4. Une modification du plan d'exécution est-elle bénéfique ?

Comme toujours, cela dépend....

5. Comment éviter les modifications de plan d'exécution ?

Pour éviter les modifications de plan, il y a deux approches.

5.1 EmpĂŞcher toute modification

A coup sûr cette approche ne conviendra à PERSONNE :

  • ne pas modifier les donnĂ©es
  • ne pas recalculer les statistiques
  • ne pas changer les paramètres
  • ne pas changer le logiciel Oracle

5.2 ContrĂ´ler le fonctionnement de l'optimiseur

Utiliser une des méthodes suivantes pour contrôler le fonctionnement de l'optimiseur :

  • les Hints
  • les Stored Outlines
  • le SQL Profile
  • Le SQL PLan Management

 

Dans la partie 2 de cette série d'articles, DIGORA reviendra sur ces différentes méthodes avec explications, avantages, inconvénients et cas d'utilisation. Vous souhaitez en savoir plus ? Contactez-nous ici

copy-link