IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Problème de performance : une idée ?


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Par défaut Problème de performance : une idée ?
    Bonjour,

    Je poste ce message afin de vous soumettre un problème de performance sur une base Oracle (9.2.0.7 ) utilisé par un soft nommé Aspentech.

    Les requetes sont réalisés via un appel WebService, proprietaire de la solution Aspentech, et nous n'avons pas la main sur le code source et des appels réalisés, nous sommes donc dans l'impasse de ce côté.
    Nous devons donc optimiser les indexs et les paramètres oracle (mémoire,..) pour répondre au mieux sur les appels effectués.

    J'ai recuperé une requete qui est réalisée par ce soft (non modifiable et la plus souvent exécutée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT batch_id FROM batches WHERE area_id = 3 AND  ( exists ( SELECT 
    batch_id FROM CHAR_BATCH_DATA WHERE CHAR_BATCH_DATA.batch_id = batches.batch_id 
    AND CHAR_BATCH_DATA.subbatch_id = 1203 AND parent_char_inst_path_id = 0 AND 
    char_id = 107 AND char_inst > 0 AND (latest_action < 3 OR latest_action > 4) 
    AND char_value = '19522')) AND  ( exists ( SELECT batch_id FROM CHAR_BATCH_DATA 
    WHERE CHAR_BATCH_DATA.batch_id = batches.batch_id AND 
    CHAR_BATCH_DATA.subbatch_id = 1203 AND parent_char_inst_path_id = 0 AND 
    char_id = 103 AND char_inst > 0 AND (latest_action < 3 OR latest_action > 4) 
    AND char_value = '038-CS100')) AND  ( exists ( SELECT batch_id FROM CHAR_BATCH_DATA 
    WHERE CHAR_BATCH_DATA.batch_id = batches.batch_id AND CHAR_BATCH_DATA.subbatch_id = 1203 
    AND parent_char_inst_path_id = 0 AND char_id = 98 AND char_inst > 0 AND 
    (latest_action < 3 OR latest_action > 4) AND char_value = '2012')) 
    ORDER BY batches.batch_id   ;
    Nous aimerions créer un ou des indexs qui pourraient nous permettre de gagner en performance, pour cela je vous fournit quelques informations complémentaires:

    - La table CHAR_BATCH_DATA comprend 36 millions de lignes (environ)et la table BATCHES environ 850000 lignes
    - Voici l'occurence des valeurs pour les champs appelés sur la table char_batch_data :

    batch_id - 36000000 (environ)
    char_value - 871147
    subbatch_id - 16697
    char_id - 392
    char_inst - 47
    latest_action - 2
    parent_char_inst_path_id - 0

    Quelqu'un aurait une idée sur le type d'indexd et les champs utilisés pour obtenir de meilleures performances?

    Aujourd'hui la situation est compliquée car beaucoup de traitement tournent au quotidien et les applications clientes ne repondent plus dans des delais acceptables
    Si vous désirez des infos supplémentaires, je vous les fournit avec plaisir.

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par maximepht Voir le message
    Si vous désirez des infos supplémentaires, je vous les fournit avec plaisir.
    Il faudrait voir le plan d'exécution.

    D'une manière générale, un index optimal est celui qui:
    - ne va chercher que les infos dont on a besoin (selectivité)
    - fournit toutes les colonnes nécessaires sans aller voir la table
    - et les fournit dans l'ordre désiré.

    Mais ce sera plus facile à voir avec le plan d'exécution (complet - avec les prédicats - telle que le fournit dbms_xplan)

    Cordialement,
    Franck.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Par défaut
    Bonjour,

    Merci pour ce retour.
    Veuillez trouver les informations dans le fichier en pièce jointe.

    Cdlt,
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    L'optimiseur pense ne ramener que très peu de lignes. Est-ce que les stats sont à jour, ou ont-elles été calculées sur des tables vides ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Par défaut
    Bonjour,

    Non les stats ont justement été calculées recemment sur l'ensemble du schema concerné.
    Qu'est ce qui vous fait dire cela "L'optimiseur pense ne ramener que très peu de lignes" ? Comment puis-je y remédier?

    Cdlt,

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu as essayé en modifiant la requête, peut être que les 3 accès à char_batch_data sont longs.

    Faut voir le plan et la durée d'une requête comme celle ci.
    Par contre il faudrait avoir un index différent (batch_id, subbatch_id, parent_char_inst) Les autres colonnes, peut être pas, faut tester, ça dépend des données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT DISTINCT batch_id 
    FROM BATCHES b 
    WHERE area_id = 3 
    AND EXISTS ( SELECT 1 
    		FROM CHAR_BATCH_DATA d
                  WHERE d.batch_id = b.batch_id 
    		AND d.subbatch_id = 1203 
                  AND d.parent_char_inst_path_id = 0 
                  AND d.char_inst > 0 
                  AND d.latest_action NOT BETWEEN 3 AND 4 
    		AND ((d.char_id = 107  AND d.char_value = '19522')
                  	OR (d.char_id = 103 AND d.char_value = '038-CS100' )
                      OR (d.char_id = 98 AND d.char_value = '2012') 
                      ))
    ORDER BY batch_id
    Petite précision : Attention, le coût d'un explain plan supérieur ne veut pas dire que ça va aller moins vite.

  7. #7
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par maximepht Voir le message
    Qu'est ce qui vous fait dire cela "L'optimiseur pense ne ramener que très peu de lignes" ? Comment puis-je y remédier?
    Dans le plan d'exécution, la colonne 'Rows': 1 ligne, c'est peu...
    On dirait que les stats ont été calculés avec peu ou pas de données.

    Cordialement,
    Franck.

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par maximepht Voir le message
    Qu'est ce qui vous fait dire cela "L'optimiseur pense ne ramener que très peu de lignes" ? Comment puis-je y remédier?
    Si vous regarder votre plan vous allez trouver dans la colonne Rows seulement la valeur 1 qui signifie que à chaque étape du plan l’optimiseur estime qu’un seul enregistrement passera. Or cella n’est pas le cas ! Or des estimations erronées dans le plan d’exécution égal mauvais plan d’exécution. Le plus souvent cela est le signe des statistiques incorrectes mais des autres causes peuvent intervenir également (données avec des distributions non uniformes, données corrélées, etc.)
    Pour remédier (sur votre version 9.2.X) il n’y a pas des miracles : il faut comprendre l’origine du problème.
    1. Commencer par vous assurer que l’optimiseur travail en mode coût. Quelle est le paramétrage de l’optimiseur ?
    2. Assurez-vous que les statistiques sont à jour. Comment sont les statistiques calculées, avec quelle commande et quels paramètres ? Y a-t-il des histogrammes ou pas ? Si oui ces histogrammes sont nécessaires ou pas ?
    3. Exécutez la requête avec une trace sql étendue. Attention si la requête utilise des variables de liaison faite la trace avec des variables de liaison. Extrayez via tkprof le plan réel d’exécution de la requête et comparez les cardinalités réels avec les estimations.
    4. Cherchez les « premières » étapes du plan où la différence entre les cardinalités estimés et ceux réels est importante. Trouvez une explication à cette différence.
    5. Eventuellement, essayez d’imaginer le « bon plan d’exécution » et d’aiguiller l’optimiseur vers ce plan pour le valider vos idées. Utilisez des hints sql !
    6. Très rarement : faite une trace de l’optimiseur pour voir les calculs qu’il utilise pour prendre ses décisions.


    Bon courage

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/04/2007, 11h24
  2. Réponses: 50
    Dernier message: 12/04/2007, 12h04
  3. Réponses: 4
    Dernier message: 02/03/2007, 12h35
  4. Réponses: 2
    Dernier message: 28/08/2006, 14h16
  5. Problème de performance sur une "grosse" BD
    Par frechy dans le forum Installation
    Réponses: 9
    Dernier message: 19/09/2005, 17h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo