Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/09/2005, 13h30   #1
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

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

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
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 :
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 :
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.
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2005, 14h29   #2
Membre habitué
 
Inscription : avril 2003
Messages : 284
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : avril 2003
Messages : 284
Points : 124
Points : 124
Envoyer un message via MSN à marsup54 Envoyer un message via Skype™ à marsup54
Si c'est une simple jointure entre deux tables, pourquoi ne pas faire tout simplement :

Code :
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)
marsup54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2005, 14h45   #3
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

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

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
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.
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2005, 14h58   #4
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

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

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
Je viens de faire un test qui me déroute encore un peu plus.

Si je fais:

Code :
1
2
 
SELECT A1,B1 FROM A,B WHERE B2='xxxxxx'
la réponse est instantanée

alors que

Code :
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 ???
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2005, 12h25   #5
Membre habitué
 
Inscription : avril 2003
Messages : 284
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : avril 2003
Messages : 284
Points : 124
Points : 124
Envoyer un message via MSN à marsup54 Envoyer un message via Skype™ à marsup54
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.
marsup54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2005, 16h01   #6
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

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

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
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 :
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.
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h35.


 
 
 
 
Partenaires

Hébergement Web