|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
![]() ![]() |
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 :
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 :
Quelqu'un peut-il me donner une idée ? Merci. |
||||
|
00
|
|
|
#2 |
|
Membre habitué
![]() |
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) |
|
|
00
|
|
|
#3 |
![]() ![]() |
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. |
|
00
|
|
|
#4 | ||||
![]() ![]() |
Je viens de faire un test qui me déroute encore un peu plus.
Si je fais: Code :
alors que Code :
Est-ce qu'une procédure stockée pourrait être une solution ??? |
||||
|
00
|
|
|
#5 |
|
Membre habitué
![]() |
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. |
|
|
00
|
|
|
#6 |
![]() ![]() |
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 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. |
|
00
|
Copyright © 2000-2012 - www.developpez.com