|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : août 2005 Messages : 3 ![]() |
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 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... |
|
|
00
|
|
|
#2 |
|
Nouveau Membre du Club
![]() Inscription : février 2006 Messages : 27 ![]() |
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. |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : août 2005 Messages : 3 ![]() |
Hélas, on n'a pas le droit de créer de table, même temporaire... Sinon j'aurais bien essayé...
|
|
|
00
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Inscription : février 2006 Messages : 27 ![]() |
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' |
|
|
00
|
|
|
#5 |
![]() ![]() |
Ce n'est pas grand chose mais enleve le ltrim il ne sert à rien puisque tu fait un substr après.
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 097 ![]() |
Il serait judicieux d'avoir le chemin d'accès choisi par DB2 (fonction EXPLAIN en DB2 for z/OS) ...
|
|
|
00
|
|
|
#7 |
|
Membre chevronné
![]() Guillaume VENTREz/OS Technical Leader Inscription : décembre 2006 Messages : 514 ![]() |
De toute manière avec une build-in fonction dans la WHERE condition cela sera peu performant
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Inscription : mai 2002 Messages : 24 ![]() |
Salut
Quel est le nombre de valeur possible de champ_dec et de champ_char A+ |
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Que donne cette requête ?
Code :
Cependant, dans tous les cas, on ne coupera pas à l'overhead dû à la conversion de type. |
||
|
|
00
|
|
|
#10 |
![]() ![]() |
Tu peux aussi essayer avec les fonctions Cast ou digit. Il se peut qu'elles soient plus performantes.
|
|
00
|
|
|
#11 | |||
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 097 ![]() |
Citation:
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 ... |
|||
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Moi aussi, j'aimerais bien voir ce résultat...
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com