Articles avec le tag ‘Tuning Oracle’
Introduction
L’Optimizer est la partie la plus importante d’une instance Oracle. C’est lui qui choisit quelle chemin il va prendre pour prendre/modifier les données que vous lui ordonnez. Toutes les étapes qu’il va prendre s’appelle le plan d’exécution.
Exemple de plan d’exécution généré via SQL*Plus :
Plan d'exécution
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=143 Card=1438 Bytes=503300)
1 0 TABLE ACCESS (FULL) OF 'PS_PERSONAL_DATA' (Cost=143 Card=1438 Bytes=503300)
Sur celui-ci par exemple, on observe que l’Optimizer a choisi de scanner complètement la table PS_PERSONAL_DATA , qu’il a parcouru 1438 lignes soit 503,300 kiloBytes de données et que la requête a un coût estimé à 143.
Je paris que vous avez un certain nombre de questions qui vous viennent à la tête tout de suite :
Comment il choisit son « chemin » ce fameux Optimizer ?
Alors, il choisit en fonction de ce qu’on appelle « le coût ». Le coût est un indice qu’Oracle donne à certaines étapes du plan d’exécution. Plus le coût est grand, plus l’action est consommatrice de ressources/temps (dans l’idéal d’Oracle parce que ça se passe pas tout le temps comme ça). Par exemple, un balayage complet d’une table aura un coût plus élevé qu’une sélection partielle de lignes.
Comment elle calcule le coût notre base de données ?
Ca, c’est le jardin secret d’Oracle. C’est un algorithme que seules quelques personnes connaissent dans le monde entier. Pour avoir une migration d’Oracle 8i vers 10G, le fait que ce soit secret est la principale cause des déboires des Administrateurs de bases de données lors des changements de version d’Oracle. On ne sait jamais vraiment si les performances seront très dégradées/améliorées lorsqu’on migre une application sur une nouvelle version d’Oracle.
Peut-on influencer les choix de l’Optimizer ?
Bien sûr qu’on peut ! C’est d’ailleurs le sujet de cet article. Influencer l’Optimizer est une des principales pistes de Tuning que vous devez explorer sur votre base de données.
Y a-t-il eu des changements importants dans l’Optimizer ces dernières versions ?
Beaucoup de changements. Depuis la version 10G, Oracle a « abandonné » (plutôt déprécié) les modes Rule et Choose et a tout misé sur le mode Cost-based. Vous pouvez choisir entre le mode ALL_ROWS qui privilégie le débit et le mode FIRST_ROWS(n) qui privilégie le temps pour les « n » premiers résultats. Bien sûr, vous pouvez toujours choisir le mode RULE mais l’Optimizer ne tiendra pas compte de ce mode et passera en mode Cost-Based si il juge que c’est mieux pour certaines requêtes.
Finis les questions ? On passe à la liste des paramètres ! Si vous avez d’autres questions, postez les en commentaire. J’ajouterai les réponses à la liste des questions ci-dessus.
Je ne traiterai que des version 10G et 8i dans cette page car je n’ai pas beaucoup travaillé sur d’autres versions (9i et 11G). De plus, je n’évoque que des paramètres conseillés pour l’OLTP (environnement transactionnel) car je n’ai pas d’expériences en DatawareHouse.
OPTIMIZER_MODE
C’est le mode de fonctionnement de l’Optimizer. 4 valeurs sont possibles : CHOOSE, RULE, ALL_ROWS, FIRST_ROWS. Le premier paramètre laisse l’Optimizer choisir entre le mode RULE et COST BASED. Le deuxième paramètre force le mode RULE . Les deux derniers paramètres forcent le mode COST BASED mais avec deux approches différentes :
-
ALL_ROWS permet de privilégier le débit global
-
FIRST_ROWS permet de privilégier le débit des premiers résultats sortis par une requête
Note : Le mode Rule est devenu obsolète en 10G
Rang de valeurs : RULE, ALL_ROWS, FIRST_ROWS, CHOOSE
Valeur par défaut : ALL_ROWS en 10G, CHOOSE en 8i
Valeur Recommandée pour l’OLTP : CHOOSE
OPTIMIZER_DYNAMIC_SAMPLING
Contrôle le niveau de dynamic sampling, qui permet de calculer les statistiques automatiquement. Plus la valeur est grande, plus le « Dynamic Sampling » est agressif. A 0, le Dynamic Sampling est désactivé.
Note : Existe seulement en 10G
Rang de valeur : 0-10
Valeur par défaut : 2
Valeur recommandée pour l’OLTP : Ca dépend de la quantité de donnée mise à jour/insérées durant une journée. Si vous modifiez/ajoutez plus de 10% de vos données actuelles dans vos tables, Oracle conseille de mettre une valeur grande. Sinon, une valeur de 2 suffira.
OPTIMIZER_INDEX_CACHING
Détermine en pourcentage de nombre de blocs d’index auxquels l’Optimizer peut s’attendre dans le cache.
Rang de valeur : 0 – 100
Valeur par défaut : 0
Valeur recommandée pour l’OLTP : 0
OPTIMIZER_SECURE_VIEW_MERGING
Existe seulement en 10G
Permet d’autoriser ou pas l’Optimizer à vérifier si la vue viole des règles de sécurité.
Rang de valeur : True, False
Valeur par défaut : True
Valeur recommandée pour l’OLTP : False
OPTIMIZER_INDEX_COST_ADJ
Ajuste le coût de parcours d’un index contre un Full Scan. Plus la valeur est petite, plus l’optimiseur est enclin à choisir un index dans le plan d’exécution.
Rang de valeur : 1 – 10 000
Valeur par défaut : 100
Valeur recommandée pour l’OLTP : 100
OPTIMIZER_FEATURES_ENABLE
Permet de forcer l’exécution du noyau comme il était dans une certaine version d’Oracle. Par exemple, si ce paramètre vaut 8.0.6, l’optimizer exécutera la requête comme sur une instance Oracle 8.0.6.
Rang de valeur : Tous les numéros de versions Oracle
Valeur par défaut : Numéro de version d’Oracle
Valeur recommandée pour l’OLTP : Valeur par défaut
OPTIMIZER_PERCENT_PARALLEL
Obsolète en 10G.
Plus la valeur est grande, plus l’Optimizer sera enclin à exécuter en parallèle des requêtes. Ce qui permet d’améliorer significativement les gros traitements, surtout les FULL TABLE SCAN. La valeur de 100 force l’Optimizer à exécuter constamment les requêtes en parallèles. Ce paramètre est surtout utile pour le datawarehousing. Il est plutôt conseillé de passer par des indexs en OLTP.
Rang de valeur : 0 – 100
Valeur par défaut : 0
Valeur recommandée pour l’OLTP : 100 / Nombre d’utilisateurs simultanés
OPTIMIZER_MAX_PERMUTATIONS
Seulement en 8i. Paramètre caché en 10G.
Restreint le nombre de permutations de tables que l’Optimizer va prendre en compte dans les requêtes avec des jointures.
Rang de valeur : 4 – 80 000
Valeur par défaut : 80 000
Valeur recommandée pour l’OLTP : < 1000
