|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Bonjour,
Afin de satisfaire une demande client, j'essaye d'optimiser une requête SQL. Cette requête ramène 12 lignes seulement mais prend environ 3 minutes pour l'exécution (ce qui est très long car la volumétrie des tables va augmenter régulièrement) Les plus grosse tables de ma requête sont : (ceci est une indication) P_Tarif_com avec plus de 600 000 lignes P_Tarif_palier avec plus de 600 000 lignes P_assoc_bareme_prestation avec plus de 80000 lignes P_bareme avec 15000 lignes Ma requête est la suivante : je met en gras dès qu'il y a un index: Code :
Désole pour la longueur des clauses where mais c'est pour vous donner une idée du nombre de sélection de chaque clause. NB: Cett requête est exécuté par businness object, d'où un nombre important de sélection Voici mon explain plan: (voir la pièce jointe) Liste des index: P_ASSOC_BAREME_prest -> 1index sur 3 champs (fk_bar_numero_bareme,fk_prestation,date_debut) P_TARIF_COM -> 1 index sur 3 champs (FK_ABP_NUMERO_BAREME, FK_ABP_PRESTATION, FK_ABP_DATE_DEBUT) P_tarif_palier -> 1 index sur (debut, fk_numero_tarif) il y a des index sur toutes les jointures (voir en gras dans le code) Il n'y a aucun index sur les dates (mais la volumétrie est faible, moins de 50 dates différentes) Merci de m'éclaircir sur la démarche à suivre pour pouvoir diminuer mon temps de réponse, si cela est possible Cordialement |
||
|
|
00
|
|
|
#2 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Voici l'explain plan correct
Désolé pour le désagrément |
|
|
00
|
|
|
#3 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Pas facile de répondre comme ça
Moi ce qui m'étonne c'est le coût de 81 pour un accès par ROWID. Peut-être bien que tu gagnerais avec un index sur ces 2 colonnes : Code :
|
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
C'est normal en ce qui concerne fk_gba_operateur car c'est une base de données d'un infocentre afin de faire des rapports Business Object dessus, donc il n'a pas de contrainte au niveau des foreign key, le contrôle est effectué au moment du peuplement de la base par des scripts (voila pour la petite explication
En ce qui concerne la Table P_bareme, il y a 3 indexs 1 sur le champ numero_bareme (pour la jointure) 1 sur fk_gba_operateur 1 sur fk_gba_groupe_bareme Peut être que l'optimisation est maximale pour cette requête cependant je n'ai pas encore la compétence pour analyser correctement et interpréter correctement l'explain plan Merci pour vos suggestions et vos explications NB: le bon explain plan est le second |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Cela peut être une grande aide, j'ai essayé de mettre en surbrillance les jointures du schéma MPD (il manque certainement 1 table ou 2 table cause manque de place)
|
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
à ta place j'essayerai d'ajouter la colonne BAREME dedans
|
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Il faut examiner les accès de type index rang scan. A priori l’index BOINT.PK_P_TARIF_PALIER manipule 575 000 lignes (575K ?). De même BOINT.PK_P_ASSOC_BAREME_PRESTATION 52 000 lignes mais au bout du compte le plan estime qu’il y aura une seule ligne. Il se peut que ces indexes ne sont pas bons pour cette requête.
Exécute une trace SQL et examine le plan réel, est-ce que le nombre des lignes manipulées est du même ordre de grandeur ? Quelle est la méthode de collecte des statistiques et à quel moment les statistiques sont calculées ? En fin quelle est la version d’Oracle ? |
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Voici l'explain table ce qu'elle contient.
Sinon je suis sur du Oracle 8i et je vais être franc avec toi j'ai du mal avec tes 2 derniers points Exécute une trace SQL et examine le plan réel, est-ce que le nombre des lignes manipulées est du même ordre de grandeur ? Quelle est la méthode de collecte des statistiques et à quel moment les statistiques sont calculées ? En fin quelle est la version d’Oracle ? Je suis novice dans la partie optimisation, merci de ta compréhension |
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
je persiste à penser que le problème vient de P_BAREME qui indique un coût élevé pour récupérer seulement 3 valeurs, comparer au cout de 3 pour les 575K valeurs
|
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Oki, je vais donc créer un index à double attribut sur la table p_Bareme;
Question annexe, faut-il modifier l'index existant en rajoutant le champ barême ou garder cet index et rajouter un index avec le BAREME + FK_GBA_OPERATEUR Cette demande soulève une question; Si j'utilise une jointure sur 1 attribut mais que on ne dispose que d'index comportant plusieurs attribut est-ce optimal?? Quel est la meilleure solution si ma requête utilise que l'attribut toto Index1(toto) Index2(toto,titi) Ou Index1(toto,titi) Merci |
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
A priori vaut mieux modifier l'index existant (à moins que le couple soit rarement utilisé) mais bon, on va avoir du mal à répondre sans connaitre la sélectivité des données et l'utilisation de ces colonnes dans les requêtes
|
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Pour information, mon rapport Business Object passe de 2 minutes à 1 minutes avec la solution de l'index double
D'après vous est-ce un temps raisonnable pour ce type de requête?? |
|
|
00
|
|
|
#13 | ||||
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
La condition suivante et toutes les doubles conversions sont à revoir:
Code :
Si le but est juste de tronquer la date alors il y a d'autres moyens. d'un autre côté, si la partie horaire n'est pas pertinente dans les données alors il faut déjà tronquer à l'insertion des données et en suite fiaire tout simplement Code :
|
||||
|
|
00
|
|
|
#14 | ||||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Citation:
Peut tu essayer de analyser toutes les tables concernée et exécuter ensuite la requête ? Code :
Citation:
Des explications se trouvent ici (Papers) |
||||
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Bonjour,
J'ai enlevé l'index du modérateur orafrance afin de rester dans le même état que précédemment. De plus j'ai effectué un analyse de toutes les tables et enfin j'ai refait un explain plan qui est celui - ci A titre d'information je vais vous joindre l'explain plan avec un index supplémentaire sur l'attribut bareme de la table p_bareme qui améliore le coût Merci pour votre aide |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Voici l'explain plan avec un index supplémentaire sur bareme de la table p_bareme
Je tiens à préciser que je calcul le temps d'exécution de la requête en la lançant avec business object, car le client va tester à partir de cet outil. |
|
|
00
|
|
|
#17 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Au vu de la volumétrie, ça parait pas mal
![]() PAr contre, en terme de méthodologie c'est très mauvais Citation:
|
|
|
|
00
|
|
|
#18 | ||||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
Citation:
|
||||
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Voici l'explain plan avec un index double comme tu me l'avais suggéré hier sur la table p_bareme
|
|
|
00
|
|
|
#20 |
|
Invité de passage
![]() Inscription : avril 2006 Messages : 69 ![]() |
Le cout indique sur la première ligne est extrêmement élevé avec 322. Ceci est du qu'il y a niveau de la hiérarchie plusieurs nested loops qui effectue le même parcours, comme si la requête faisait un produit cartésien
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com