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

DB2 Discussion :

Requete a chemin d'accès non optimal et pas celui attendu


Sujet :

DB2

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut Requete a chemin d'accès non optimal et pas celui attendu
    Bonjour à tous
    Nous avons en production une problematique d'application qui tombe en abend en raison d'une requête lancée sur le DB2 mainframe qui ne répond pas en temps voulu car très peu performante.

    La situation:

    Une table T1 3 millions de lignes avec 20 colonnes toutes valorisees.
    Une table T2 2500 lignes avec 5 colonnes toutes valorisees sauf la Col2 qui n'est valorisée que pour 3 occurences.

    Requete:

    SELECT * FROM T2, T1
    WHERE T2.COL2= T1.COL1
    AND T2.COL1= 'numero d'abonné'
    AND T1.COL2 <> 'm'
    AND T1.COL1 > 'numero de contrat' (pour le repositionnement).

    Indexs:
    XT1 COL1. Cluster.
    XT2 COL1 COL2 cluster.

    Lors de l'exécution de la requête T2.COL2 est toujours valorisé donc on devrait théoriquement entrer par le numéro d'abonné pour lequel nois avons besoin de vérifier que celui ci est bien connu en base personne.
    On devrait donc avoit un accès du genre:

    Meth 0 sur T2 via XT2 mc 2
    Meth 1 sur T1 via XT1 mc 1

    Car on entre par la clé de la plus petite table qui est discriminante.

    Mais non c'est quasi l'inverse qui se produit...

    Meth 0 sur T1 via XT1 mc 1 sequential prefetch
    Meth 1 sur T2 via XT2 mc 1


    Runstats et reorg passés.
    Résultat la requête est fortement consommatrice et l'application tombe alors en erreur a cause de cela(traces posées qui ont confirmé le diagnostic)


    Si l'on force le passage par l'index de T2 voulu la requete fonctionne alors de façon optimale et repond.

    Une piste?

    Merci.

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Bonjour,

    1) c'est donc du Batch ?

    2) on souhaite gérer un repositionnement ? si oui, pourquoi et comment ?

    3) pourquoi ne pas distinguer un curseur "normal" et un curseur "de repositionnement" ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Bonjour
    Non il s'agit de TP.
    Oui un repositionnement est codé pour ce type de module d'accès aux données de type liste.
    Il s'agit ici d'affiches la liste des contrats depuis un écran où le numéro d'abonné est renseigné.

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    La table T1 est la table des contrats et la table T2 la table des abonnés ?

    On cherche à afficher à l'écran la liste des contrats pour un abonné donné ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Oui c'est bien ça.
    Un abonné peut avoir "n" contrat.
    Vois-tu une piste pouvant expliquer à la stratégie choisie par db2?
    Merci.

  6. #6
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    bonjour

    une piste

    Change "AND T1.COL1 > 'numero de contrat' " en t2.col2.... Ta 1ere condition est "T2.COL2= T1.COL1", ca ne changera rien au résultat .
    ++

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Bonjour Bernard
    Déjà essayé cela ne change rien au chemin d'accès malheureusement. C'est pourquoi je voudrais savoir la raison de cette stratégie par db2.
    Merci.

  8. #8
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Quelque chose m'échappe et je vais sans doute dire une bêtise, mais il ne manquerait pas un index dans la table des contrats sur le numéro d'abonné ?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Non pas de betise c'est juste ma retranscription qui n'est pas assez claire.
    Le numero d'abonné nest pas present en table contrat.
    La jointure se fait sur le numero de contrat present en T1 et T2. Le but est de ramener les données liées à tous les contrats de l'abonné (présentes en T1).
    Desolé du manque de clarté.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Un indice cependant m'oriente vers un comportement lié au données de la table contrat elle meme.
    Car en environnement de préproduction si je charge la table avec un portefeuille identique en terme de volumétrie mais provenant d'un autre centre alors le chemin d'accès bascule sur celui attendu donc optimal...
    Je regarde la distribution des données et ne voit pas grand chose qui pourrait le justifier.
    Pour etre sur que ce phenomene n'est pas lié à la plateforme je charge en préproduction les données de production et là on rebascule bien sur la mauvaise stratégie d'accès. .

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si vos index sont créés
    - sont ils discriminants (nombre de valeurs distinctes), pour les colonnes alimentées dans la requête
    - les réorg sont elles faites (tant qu'à faire )
    - vos stats sont elles à jour
    - les packages ont ils été rebindés

    Et aussi : remplacez le select * par une liste des colonnes utiles au traitement, un select * est dangereux car sensible au DDL et dégrade les perfs en transportant des données inutiles (à minima, les critères de jointure que vous avez 2 fois)

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par s2rs2 Voir le message
    Non pas de betise c'est juste ma retranscription qui n'est pas assez claire.
    Le numero d'abonné nest pas present en table contrat.
    La jointure se fait sur le numero de contrat present en T1 et T2. Le but est de ramener les données liées à tous les contrats de l'abonné (présentes en T1).
    Desolé du manque de clarté.
    En relisant les différentes réponses, celle-ci m'interpelle
    Comment le n° de contrat peut il etre présent dans la table des abonnés, puisque vous mentionnez plus haut qu'un abonné peut avoir plusieurs contrats ?
    Ou alors, la table T2 que vous mentionnez comme une table des abonnés est en faite une table issue de la relation entre abonné et contrat

    Si le schéma relationnel est bien
    T2 (abonné) 0,n ----- 1,1 T1 (contrat)
    C'est à dire les règles de gestion suivantes
    1 abonné peut avoir plusieurs contrats
    1 contrat appartient à un et un seul abonné

    Alors on devrait avoir
    - aucune FK issue de contrat dans la table abonné
    - la PK abonné présente dans contrat en tant que FK, et, de préférence, avec une contrainte de type référence de contrat.FK vers abonné.PK

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    affirmatif pour toutes les questions ci dessous.

    Et la valorisation des colonnes en lieu et place du select * ne résoud pas le problème.

    Merci.
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Si vos index sont créés
    - sont ils discriminants (nombre de valeurs distinctes), pour les colonnes alimentées dans la requête
    - les réorg sont elles faites (tant qu'à faire )
    - vos stats sont elles à jour
    - les packages ont ils été rebindés

    Et aussi : remplacez le select * par une liste des colonnes utiles au traitement, un select * est dangereux car sensible au DDL et dégrade les perfs en transportant des données inutiles (à minima, les critères de jointure que vous avez 2 fois)

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par s2rs2 Voir le message
    Bonjour,

    affirmatif pour toutes les questions ci dessous.

    Et la valorisation des colonnes en lieu et place du select * ne résoud pas le problème.

    Merci.
    D'accord, au moins ça c'est fait
    La valorisation des colonnes à la place du select * n'est pas tant pour les perfs, bien que ce soit non négligeable surtout en cas de tables obèses (ce n'est pas le cas ici), que aussi et surtout pour la stabilité du résultat.
    D'ailleurs, de nombreux sites de production interdisent les select * pour ces raisons
    Ce qui m'inquiète le plus c'est les questions de mon post suivant sur les FK

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Un abonné peut avoir plusieurs contrats effectivement.
    Dans la table abonnés le couple abonné/contrat est unique. On peut donc avoir plusieurs fois le même abonné mais pour des contrats différents.
    Les règles de gestions que vous citez sont correctes.
    L'intégrité pour ces objets n'est pas gérée par DB2 mais de manière applicative.

    Même si l'architecture peut paraitre "bancale" le but de mon post est surtout d'essayer de comprendre la stratégie adoptée par DB2 qui n'est vraiement pas celle attendue pourtant sur une requête peu complexe.
    Le tout étant visiblement lié au contenu (cf mes tests avec un autre portefeuille à volumétrie équivalente).
    J'opterais éventuellement pour la ventilation des numéro de contrats mais rien ne saute aux yeux...

    Merci.

    Citation Envoyé par escartefigue Voir le message
    En relisant les différentes réponses, celle-ci m'interpelle
    Comment le n° de contrat peut il etre présent dans la table des abonnés, puisque vous mentionnez plus haut qu'un abonné peut avoir plusieurs contrats ?
    Ou alors, la table T2 que vous mentionnez comme une table des abonnés est en faite une table issue de la relation entre abonné et contrat

    Si le schéma relationnel est bien
    T2 (abonné) 0,n ----- 1,1 T1 (contrat)
    C'est à dire les règles de gestion suivantes
    1 abonné peut avoir plusieurs contrats
    1 contrat appartient à un et un seul abonné

    Alors on devrait avoir
    - aucune FK issue de contrat dans la table abonné
    - la PK abonné présente dans contrat en tant que FK, et, de préférence, avec une contrainte de type référence de contrat.FK vers abonné.PK

  16. #16
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    D'accord, en ce cas, la table T2 est bien une table issue de la relation entre abonnés et contrats
    Mais du coup, comment peut il n'y avoir que 2500 rows dans T2 alors qu'il y a 3 000 000 de contrats dans T1
    Ca sous entend que la quasi totalité des contrats ne fait référence à aucun abonné

    Ces questions sur le modèle peuvent vous sembler en marge du sujet, mais j'avoue avoir du mal à raisonner sur la requête sans comprendre comment ces 2 tables s'articulent

  17. #17
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Sinon avez vous vérifié que le format des host variables, en particulier celle du n° d'abonné, était bien identique à celui du DDL (même type et même longueur).
    Ca pourrait expliquer

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    aucun souci, ceci est une retranscription peut être un peu légère. Afi nde mieux comprendre on pourra parler d'évenement plutot que de contrat.

    La table T2 est donc la table concernant un certain type de produit(peu developpé).
    Dans cette table on trouvera donc les évenements liés à ce type de produit ainsi que le numéro d'abonné à ce produit.
    On va alors aller en table T1 rechercher tous les evenements générés pour un numéro d'abonné bien précis via la jointure entre numéro d'evenementT2 et numéro d'evenement T1.
    Un abonné de ce type de produit pouvant donc générer n evenements en T1.
    Avec la particularité que le numéro d'abonné de ce type d'evenement n'est que très rarement valorisé en table T2 car c'est un critère de recherche qui appelle à être abandonné.
    Et c'est d'ailleurs pour cela que les abends de ce type dans l'application n'arrivent que quelques fois sur une journée(pour plusieurs milliers de recherche).

    En résumé:

    T1 evenements (tout produit)|COL2|COL3|COL4 etc....
    T2 evenment (produit X)|numero abonné|COL3



    Merci.



    Citation Envoyé par escartefigue Voir le message
    D'accord, en ce cas, la table T2 est bien une table issue de la relation entre abonnés et contrats
    Mais du coup, comment peut il n'y avoir que 2500 rows dans T2 alors qu'il y a 3 000 000 de contrats dans T1
    Ca sous entend que la quasi totalité des contrats ne fait référence à aucun abonné

    Ces questions sur le modèle peuvent vous sembler en marge du sujet, mais j'avoue avoir du mal à raisonner sur la requête sans comprendre comment ces 2 tables s'articulent

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Oui le format de la donnée en entrée est le bon.

    Citation Envoyé par escartefigue Voir le message
    Sinon avez vous vérifié que le format des host variables, en particulier celle du n° d'abonné, était bien identique à celui du DDL (même type et même longueur).
    Ca pourrait expliquer

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Autre précision:

    Si dans l'explain on valorise la clause de repositionnement AND T1.COL1 > low value (ou 0 ou autre) alors le chemin d'accès bascule sur celui attendu...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Caractères non conformes dans le chemin d'accès.
    Par stephan1932 dans le forum VB.NET
    Réponses: 21
    Dernier message: 21/08/2015, 13h12
  2. Réponses: 3
    Dernier message: 21/04/2013, 23h33
  3. [AC-2007] Chemin d'accès non valide
    Par monicacruzz dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/02/2011, 20h53
  4. [Winforms]Caractères non conformes dans le chemin d'accès
    Par Hemophilius dans le forum C++/CLI
    Réponses: 3
    Dernier message: 08/10/2008, 13h59
  5. Chemin d'acces non valide
    Par Alex063 dans le forum Access
    Réponses: 13
    Dernier message: 28/03/2006, 11h29

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