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

AS/400 Discussion :

forcer strategie SQL DB2


Sujet :

AS/400

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut forcer strategie SQL DB2
    Bonjour,

    Nous rencontrons un problème dans l'exécution en batch d'une requête SQL qui s'exécute parfaitement en interactif.
    Nos recherches nous ont permis de mettre en évidence une différence de schéma entre l'exécution interactive et batch, dans cette dernière, l'optimiseur utilise un fichier index différent qui est un fichier de l'applicatif que nous utilisons (movex) et que nous ne pouvons donc pas modifier/supprimer.

    Nous avons testé l'exécution du SQL à partir d'une bibliothèque de travail préalablement alimentée par une copie des fichiers d'origine.
    Quand il n'y a ni index ni logique, le traitement se déroule correctement et se termine en quelques minutes.
    Si nous ajoutons un fichier index semblable à celui de Movex, le traitement ne se termine pas (Kill au bout de 45mn) et consomme énormément de cpu, bien que nous ne voyons aucune trace d'avancement (enregistrements fichiers) dans les logs du travail.

    Conclusion, nous souhaiterions pouvoir exécuter dans l'environnement de production cette requête en s'appuyant sur un schéma qui n'utiliserait pas l'index de Movex.
    Cela est-il possible ?

    Marie

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Conclusion, nous souhaiterions pouvoir exécuter dans l'environnement de production cette requête en s'appuyant sur un schéma qui n'utiliserait pas l'index de Movex.
    Vous pouvez, avant de lancer votre batch, drop des indexs et les re-créer ensuite à la fin du traitement.

    Mais au vu des symptômes, ne serai-t-il pas mieux de chercher la cause du 1er problème ?

    edit: sinon pourriez-vous préciser quelle version de DB2 vous utilisez ?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci por votre réponse mais je ne peux pas pas faire de DROP su ces index, ils sont utilisés par notre applicatif principal.
    Nous sommes en version V5R4M0.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Le problème étant que l'optimiseur va essayer d'utiliser ces indexs par défaut, car selon lui ca sera la meilleur solution.

    Il me semble que vous pourriez contourner ceci en mettant des droits spécifiques sur vos indexs afin que le pgm batch ne puisse les utiliser (à confirmer mais il me semble avoir déjà vu ce cas lors de nos test).

    sinon, pourriez-vous développer ce point car je ne comprend pas bien :
    Nous rencontrons un problème dans l'exécution en batch d'une requête SQL qui s'exécute parfaitement en interactif.
    Nos recherches nous ont permis de mettre en évidence une différence de schéma entre l'exécution interactive et batch, dans cette dernière, l'optimiseur utilise un fichier index différent qui est un fichier de l'applicatif que nous utilisons (movex) et que nous ne pouvons donc pas modifier/supprimer.
    Votre batch n'utilise pas les mêmes tables sql pour travailler ?
    Avez-vous bien vérifié les bibliothèques utilisées par votre pgm batch ? (par exemple une table serai dupliquée dans QGPL et votre jobd aurai QGPL en 1er ? ou QTEMP ou ..)

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Oui, c'est bien ça, l'optimiseur semble ne pas utiliser les mêmes index en batch et en intéractif.
    J'ai vérifié, ces tables n'existent que dans les bibliothèques de production.
    Merci.
    Marie

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Outre le fait d'interdire l'acces à l'index via des droits d'exclusion spécifique, peut être une autre piste pour vous.

    Une différence entre les exécutions entre interactif / batch qui peut amener a l'utilisation de schéma différent des requêtes SQL :
    Par défaut (si vous n'avez pas changé le QAQQINI / implanté de close OPTIMIZE FOR / FETCH FIRST) l'optimiseur va créé un plan "optimisé" pour ramener les 10 (ou 20 je ne sais plus) 1ere row au plus vite en exécution interactive alors qu'en exécution de type batch il va tenté de ramener au plus vite la totalité des enregistrements.

    => Ceci change souvent les plan d'exécutions.

    Pourriez-vous voir si en rajoutant une close OPTIMIZE FOR 10 ROWS ONLY dans votre pgm batch si le plan créé est le même que lorsque vous lancez la requête de manière interactive ?

    Malheureusement si cela fonctionne ca ne vous garantira pas un fonctionnement permanent car l'optimiseur pourra décider, pour une raison X d'utiliser l'index qui pose problème de nouveau.


    Autre piste aussi pour la non utilisation d'un même index, ce serai une différence entre vos 2 requête SQL entre batch / interactif, que ce soit au niveau de la close SELECT ou WHERE ou voir des jointure. Les 2 requêtes sont-elles identiques ?

    J'ai noté que vous n'étiez qu'"en" V5R4M0, n'y aurai-t-il pas des PTF qui pourrai régler ce problème ? (contactez IBM ?)

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Il s'agit de bugs corrigés par des PTFs (entièrement ?), c'est donc la première chose à faire mettre à jour les PTFs.
    En attendant, vous pouvez forcer l'optimiseur à faire du séquentiel en imposant un 'ORDER BY' qui va bien.
    Mettez votre requête pour voir.

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses et désolée de ne pas vous avoir répondu plus tôt.

    Nous avons programmé la mise à jour des PTFs pour le week end prochain (le 05 septembre), nous verrons donc les nouveaux résultats la semaine prochaine.

    à bientôt.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 289
    Points
    1 289
    Par défaut Bonjour Marie,
    Bonjour Marie,

    1) Tu peux afficher le "mauvais" chemin d'exécution dans Visual Explain à partir de run sql script ou du plan cache, c'est en général éclairant de voir pourquoi cela prend si longtemps.

    2) En V5R4, tu peux forcer l'utilisation de CQE en ajoutant
    "where 'A' = upper('A')"
    à ton query. CQE est un peu "bête" par rapport à SQE, il prend simplement le chemin décrit par les joins sans aucun raccourcis... mais au moins il ne s'emmèle pas les pinceaux dans ce qu'il croit être plus rapide comme SQE le fait visiblement ici.
    Si tu obtiens une exécution "normale" en CQE et très lente en SQE, tu peux envoyer la trace à IBM et tu recevras rapidemment une PTF, si elle n'existe pas déjà.

    3) en V6R1 ce sera beaucoup plus difficile de forcer CQE, mais SQE est plus malin qu'en V5R4 et depuis que nous sommes en V6R1 nous n'avons eu qu'à nous féliciter d'avoir fait la migration (et nous utilisons énormément SQL). Je croise les doigts pour que cela continue.

    Fred

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Il me semble que vous pourriez contourner ceci en mettant des droits spécifiques sur vos indexs afin que le pgm batch ne puisse les utiliser (à confirmer mais il me semble avoir déjà vu ce cas lors de nos test).
    L'optimiseur ne tient pas compte des droits sur les index.
    Un utilisateur ne possédant pas les droits sur un index (de type radix ou vecteur) n'empêche pas l'optimiseur de s'appuyer dessus (si ce dernier estime qu'il obtiendra de meilleurs temps).

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Marie,

    Comme le conseille fred, il faut récupérer l'explain de la requête.
    Ainsi on saura exactement ce qu'il se passe.

Discussions similaires

  1. SQL dynamique: PL/SQL -> DB2
    Par gael.mases dans le forum DB2
    Réponses: 3
    Dernier message: 31/10/2008, 15h25
  2. Réponses: 1
    Dernier message: 02/07/2008, 14h49
  3. pb SQL DB2/400
    Par skywaukers dans le forum DB2
    Réponses: 4
    Dernier message: 01/07/2008, 18h09
  4. [IDE][Team Foundation Server]Comment forcer MAJ SQL Reports?
    Par Misdrhaal dans le forum Contribuez
    Réponses: 4
    Dernier message: 25/01/2006, 11h41
  5. Réponses: 6
    Dernier message: 15/12/2005, 14h29

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