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 :

[SQL] Comment effectuer jointure sur une partie de clé ?


Sujet :

DB2

  1. #1
    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 : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut [SQL] Comment effectuer jointure sur une partie de clé ?
    Bonjour,

    je ne suis pas un spécialiste SQL alor je requiert votre aide.

    Je dois faire une jointure sur une table mais uniquement sur le début de la clé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select A1, B1 from A left join B on left(B2,6)=left(A1,6)
    La requête ainsi formulée renvoie le résultat voulu mais la table B contient près de 300000 enregistrements d'ou temps de réponse 3 minutes.

    Si j'ai bien compris, la présence du left empêche l'utilisation de l'index existant sur le champ B2.

    J'ai essayé sans succès d'autres méthode du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select A1, B1 from (select A1, concat(A1,'00000') as j1, concat(A1,'99999') as j2 from A) as T left join B on B2 Between j1 and j2
    mais sans succès.

    Quelqu'un peut-il me donner une idée ?

    Merci.

  2. #2
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Si c'est une simple jointure entre deux tables, pourquoi ne pas faire tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select A1, B1 from A,B where SUBSTR(A.A1,1,6)=SUBSTR(B.B1,1,6)
    Remarque : SUBSTR et LEFT font sensiblement la même chose (position de départ pour SUBSTR en plus)

  3. #3
    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 : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    PArceque si je fais cela, le temps de réponse devient désastreux.

    La table A (de test) à 7 records, la table B (réelle) à 270000 enregistrement et le temps pour la réponse est 3 minutes 20 secondes

    Il semble que le fait d'inclure une fonction l'empêche d'utiliser l'index pour les recherches. Il passe alors en mode séquentiel. Il faudriat soit une syntaxe qui lui permette d'utiliser l'index dans l'optimalisation de la recherche, soit d'imposer qu'il utilise un index bien défini.

    J'ai essayé avec between, > et <, left que ce soit en jointure ou en subselect sans résultat.

  4. #4
    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 : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Je viens de faire un test qui me déroute encore un peu plus.

    Si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select A1,B1 from A,B where B2='xxxxxx'
    la réponse est instantanée

    alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select A1,B1 from A,B where B2=substr(A1,1,6)
    le temps de réponse s'effondre. Même pour l'affichage de la première ligne.

    Est-ce qu'une procédure stockée pourrait être une solution ???

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Je sais pas si c'est faisable, mais si tu crées un index sur les 6 premiers caractères de ta chaine, ça devrait aller très vite.

    Sinon, tu ajoute une colonne à ta table B, en y mettant uniquement les 6 premiers caractères de ta chaine. Pour que ça se mettent automatiquement à jour, tu crées un trigger (insert/update) qui mets à jour cette colonne.
    Il faudra cependant que tu fasses une procédure stockée qui parcourt toute ta table une fois, pour mettre à jour cette nouvelle colonne.

    Par procédure stocké, c'est évident que c'est faisable .... en terme de temps de réponses, tout dépend les requètes que tu mettras à l'intérieur !

    ++

    PS : Si tu veux des exemples de procédures stockée, j'ai ce qu'il faut !
    Même si j'attends toujours qu'on me dise comment crée des variable de type tableau.

  6. #6
    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 : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    J'ai maintenant un champ de 6 caractères mais le problème n'a pas été résolu pour autant. En définitive, il n'était pas là ou je le penssais.
    De pas en pas, j'ai pu le cerner et il s'avère que si une requête de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from B Where B2='xxxxxx'
    est extrèmement rapide (résultat immédiat), la même requête dans une procédure stockée, le 'xxxxxx' étant alors passé en paramêtre, prend quasiment 1 minute ! Les join et autres subselect se comporte de la même manière. Si je fixe une valeur textuel au lieu d'une valeur d'un champ, c'est rapide sinon c'est très très long.

    Le problème je pense est l'accès à la DB elle même. Ma DB est une DB V7.1. La table B est en fait un federate server vers une DB DB2 sur mainframe. J'ai transmis le problème à l'administrateur DB pour qu'il voit s'il est possible d'amèliorer les choses.

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR XI] Comment filtrer sur une partie d'une texte ?
    Par juju05 dans le forum Formules
    Réponses: 1
    Dernier message: 05/08/2013, 10h48
  2. Réponses: 7
    Dernier message: 27/05/2013, 12h33
  3. [MySQL] requete SQL sur une partie d'un date
    Par stefano dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/09/2012, 13h40
  4. Réponses: 4
    Dernier message: 19/06/2007, 17h51
  5. Réponses: 15
    Dernier message: 14/04/2006, 15h34

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