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 :

[Requête] jointure externe et conversion de type


Sujet :

DB2

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 3
    Par défaut [Requête] jointure externe et conversion de type
    Bonjour,

    je dois faire des requêtes sur une base DB2 sur zOs.
    Comme c'est une base de production, je n'ai pas les autorisations pour ajouter des index par exemple.

    J'ai 2 tables (jai modifié les noms pour que ce soit lisible ) de 300 000 lignes (donc pas grosses...)

    tableA
    cle
    champ_dec DECIMAL(11)

    tableB
    cle
    champ_char CHAR(11)

    Il n'y a pas d'index sur champ_char

    Je dois récupérer tous les enregistrements de tableA dont le champ_dec ne correspond à aucun champ_char dnas tableB.
    En fait champ_dec est un entier (oui je sais )

    J'ai donc écrit la requête suivante :

    select tableA.cle
    from tableA
    where subtr(ltrim(char(tableA.champ_dec)),1,11)
    not in
    (
    select tableB.champ_char
    from tableB
    )
    ;


    Comme ça prenait des heures (littéralement), j'ai réécrit comme j'aurais fait sous Oracle, avec une jointure externe:

    select tableA.cle
    from
    tableA
    left outer join
    tableB
    on
    substr(ltrim(char(tableA.champ_dec)),1,11)=tableB.champ_char
    where tableB.champ_char is null
    ;

    Le temps de réponse est toujours aussi déplorable, je n'arrive pas au bout en une heure. Mes collègues me disent que c'est toujours comme ça lorsqu'il y a une conversion de type. Il est vrai que j'ai écrit une requête similaire (tables de même taille, pas d'index utilisable) mais sans conversion, et ça n'a pris que quelques minutes.

    Auriez-vous des idées? Car là je sèche complétement, même après avoir parcouru la doc et des forums, je n'ai rien trouvé... Je suis à court d'idées.

    Merci

    PS : je ne peux pas convertir dans l'autre sens, il y a apparemment des valeurs de champ_char qui ne sont pas numériques...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2006
    Messages : 27
    Par défaut mmh
    N'étant pas un spécialise de DB2, j'ai tout de même une idée qui serait intéressante à tester.

    L'idée est de faire une table temporaire avec ton champ modifié substr(ltrim(char(tableA.champ_dec)),1,11) puis de faire la jointure entre cette table temporaire et la table nommée tableB.

    C'est pas dit que tu gagnes réellement du temps, mais parfois, il est pratique de décomposer en plusieurs sous-problèmes, notamment en optimisation de requête.

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 3
    Par défaut
    Hélas, on n'a pas le droit de créer de table, même temporaire... Sinon j'aurais bien essayé...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2006
    Messages : 27
    Par défaut mmh
    Si tu as "le droit" de faire des procédures stockées, tu peux bien évidemment passer par ce principe.

    En revanche, si tu n'as toujours pas la possibilité de faire, ça, j'ai bien peur que tu ne puisses pas faire grand chose pour améliorer les perf'

  5. #5
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Par défaut
    Ce n'est pas grand chose mais enleve le ltrim il ne sert à rien puisque tu fait un substr après.

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

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Il serait judicieux d'avoir le chemin d'accès choisi par DB2 (fonction EXPLAIN en DB2 for z/OS) ...

  7. #7
    Membre émérite Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Par défaut
    De toute manière avec une build-in fonction dans la WHERE condition cela sera peu performant

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Par défaut
    Salut
    Quel est le nombre de valeur possible de champ_dec et de champ_char
    A+

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut Left outer join
    Que donne cette requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT tableA.cle
    FROM tableA 
    LEFT OUTER JOIN tableB 
    ON char(tableA.champ_dec) = tableB.champ_char
    WHERE tableB.champ_char IS NULL
    On peut éviter je pense l'imbrication des 3 fonctions substr, ltrim (inutile) et char et ne conserver que cette dernière.

    Cependant, dans tous les cas, on ne coupera pas à l'overhead dû à la conversion de type.

  10. #10
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Par défaut
    Tu peux aussi essayer avec les fonctions Cast ou digit. Il se peut qu'elles soient plus performantes.

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

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Citation Envoyé par Mercure
    Que donne cette requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT tableA.cle
    FROM tableA 
    LEFT OUTER JOIN tableB 
    ON char(tableA.champ_dec) = tableB.champ_char
    WHERE tableB.champ_char IS NULL
    On peut éviter je pense l'imbrication des 3 fonctions substr, ltrim (inutile) et char et ne conserver que cette dernière.

    Cependant, dans tous les cas, on ne coupera pas à l'overhead dû à la conversion de type.
    Attention à la fonction CHAR avec DB2 for z/OS ... elle donne, en plus des chiffres présents dans la colonne à convertir, un caractère à gauche pour le signe et un caractère à droite pour la virgule ...

    A mon humble avis ce n'est pas un problème de fonctions scalaires mais bien d'indexation.
    En effet, si l'optimiseur de DB2 peut partir sur un TS SCAN pour la première table (la A), il risque aussi de partir en TS SCAN sur la seconde (la B) puisqu'il semble ne pas y avoir d'index sur B.champ_char. C'est à dire que pour chaque ligne de la table A on va balayer toutes les lignes de la table B.
    Mais bon, ce n'est qu'une supposition et c'est pourquoi j'aurais bien aimé voir le résultat de la fonction EXPLAIN de la requête ...

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut idem
    Moi aussi, j'aimerais bien voir ce résultat...

Discussions similaires

  1. [Mysql5] Problème requête jointures externe
    Par sterix92 dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/12/2011, 15h03
  2. Requête Jointure externe retournant 0 si pas de liaison
    Par jubourbon dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/10/2011, 17h59
  3. Requête MAJ - Échec de conversion de type - DATE et $
    Par MarieRoy dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 23/02/2011, 04h28
  4. [Débutant]Soucis requête jointure externes (8-i)
    Par jdotti dans le forum Oracle
    Réponses: 7
    Dernier message: 14/10/2005, 16h39
  5. Réponses: 6
    Dernier message: 20/09/2004, 16h26

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