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...
Partager