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

DB2 Discussion :

UPDATE avec sous-sélection TRES lent


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut UPDATE avec sous-sélection TRES lent
    Bonjour,

    j'ai cherché à faire une requête update avec sous sélection pour remplir une colonne mais cette requête met à mal notre AS400.
    Voici la requête concerné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    update rembtest.amuaide as ds0 set datefin = (
         select
         max(ds1.dsas0dfde)
         from clilandta.dsas000 as ds1
         where
         ds0.ni = ds1.dsas0n010
         and ds1.dsas0dec like ('1%') and ds1.dsas0eta = '3  '
         and ds1.dsas0sera = 'SAN' and ds1.dsas0aide like '%AMU%'
         and ds1.dsas0ddde < 20110700 and ds1.dsas0dfde > 20110000
    )
    ;
    Quand je dis qu'elle met à mal l'AS400, c'est qu'elle utilise 60% de l'AS400 pendant très longtemps.
    La table à mettre à jour ne contient que +- 2500 enregistrements, elle est composée de 6 colonnes et personne ne l'utilise à part moi.

    Après plus d'une minute d’exécution, j'ai fait un select sur la table d'update pour voir le nombre de ligne déjà mise à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM rembtest.amuaide WHERE datefin > 0
    J'en étais à un peu moins de 100 lignes affectées.
    J'ai pu me rendre compte en actualisant plusieurs fois le résultat que la requête update affectait environs une ligne par seconde

    Donc j'aimerais savoir ce que j'ai fais de mal dans ma requête qui ne me semble pas compliquée pour avoir un tel résultat

  2. #2
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 953
    Points : 2 066
    Points
    2 066
    Par défaut
    Bonjour

    A priori, et avec les info que tu donnes, je dirais que c'est le sous-select qui consomme les ressources.

    Sur la table clilandta.dsas000 AS ds1, je vérifierai qu'un index existe sur
    • dsas0eta
    • dsas0sera
    • dsas0ddde
    • dsas0dfde
    • et sur dsas0dec

    toutes les colonnes n'ont pas besoin d'être dans un index, mais cela dépend des données.

    a+

  3. #3
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Bonsoir,

    Le plus important c'est le prédicat de corrélation. Vérifie la présence d'un index sur ds1.dsas0n010. Sans cela, oups... Sachant que le meilleur index possible serait un index multi-colonnes avec ds1.dsas0n010 en première colonne et les autres colonnes citées par bernard59139 ensuite. Si possible, les colonnes avec prédicat d'égalité d'abord, ensuite les colonnes avec like, > ou <. Evidemment, c'est la théorie, ensuite tout dépend de la grosseur des colonnes, de leur pouvoir discriminant, ..., bref des différentes statistiques.

    A contrario, si tu as plusieurs index mono-colonne sur les différentes colonnes de la requête, le risque est que DB2 fasse du multiple-index, ce qui, dans le cas présent, s'avèrerait certainement désastreux.

    Je ne suis pas spécialiste as400 (perso, c'est zos), mais j'imagine que tu peux faire un explain de ta requête, cela devrait te mener vers la bonne piste.

    Tiens nous au courant.

    Bon week.

  4. #4
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 953
    Points : 2 066
    Points
    2 066
    Par défaut
    scromeleu, j'avais laissé de coté la colonne ds1.dsas0n010
    merci pour la précision

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Tout d'abord un très grand merci pour votre intervention à tout les deux .

    Voici le suivi, en effet il n'y a pas d'index sur ces colonnes.
    Malheureusement il ne s'agit pas de table provenant de notre société et je ne peux y toucher.
    Pour faire ce que vous me suggériez, j'ai copié la table dans une bibliothèque qui nous appartient. De la j'ai réessayer sans mettre d'index pour test et là miracle, plus aucun problème. La requête est effectuée quasi immédiatement.

    Y aurait-il un problème pour faire des liaisons entre des bibliothèques différentes?

  6. #6
    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 Sankasssss Voir le message
    Y aurait-il un problème pour faire des liaisons entre des bibliothèques différentes?
    Que veux-tu dire par là ?

    Si tu ne peux pas ajouter d'index (d'ailleurs je ne vois pas pourquoi, même si cette table comme tu dis ne t'appartiens pas) vérifie que ta table ne possède pas trop d'enregistrements supprimés, ils sont quand même lus lors d'une requête. Ensuite, duplique la table QSYS/QAQQINI dans QUSRSYS et mets la valeur à *YES au lieu de *DEFAULT pour la ligne IGNORE_DERIVED_INDEX et tout va rentrer dans l'ordre.

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Ce que je veux dire c'est que lorsque j'essaye de faire un update d'une table se trouvant dans la biblio rembtest avec une sélection d'une table qui se trouve dans la biblio CLILANDTA, cela prend énormément de temps alors que quand c'est au sein de la même biblio il n'y a plus de problème...

    Si tu ne peux pas ajouter d'index (d'ailleurs je ne vois pas pourquoi, même si cette table comme tu dis ne t'appartiens pas)
    C'est parce que le contrat de maintenance du logiciel stipule que nous ne touchons pas à leur environnement.

    vérifie que ta table ne possède pas trop d'enregistrements supprimés, ils sont quand même lus lors d'une requête.
    L'application ne supprime jamais d'enregistrement dans cette table.
    Par contre il est vrais qu'il y a énormément d'enregistrement.
    Mais je ne comprend pas qu'en copiant la table dans l'autre biblio, et avec l'intégralité de ces lignes avec un CPYF, cela améliore grandement les performance. C'est pour cela que je me posais la question précédente :
    Y aurait-il un problème pour faire des liaisons entre des bibliothèques différentes?
    Je testerai dès demain le changement de IGNORE_DERIVED_INDEX dans QUSRSYS, j'espère que tu vises juste
    Merci pour ton intervention

  8. #8
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Je ne connais pas AS400, donc je ne me prononcerai pas sur des soucis de bib.

    Par contre, concernant le fait que tu ne doives pas toucher à du DDL livré par un presta extérieur. Toutes les sociétés achètent des logiciels à l'extérieur. Les seuls objets intouchables, ce sont les vues et les tables, cad ce qui est accédé dans les programmes. Par contre, tout le reste, tu es libre d'en faire ce que tu veux, par exemple changer le nom des databases, des tablespaces, des stogroups, des paramètres techniques, ... Et surtout, si tu te rends compte qu'il manque des index, il est super important de les créer et d'en prévenir le fournisseur : loin de mettre en doute une quelconque clause juridique d'un contrat, tu leur rendras un fier service car il y a de fortes chances pour que cet index puisse servir à d'autres clients du même fournisseur : tu le verras donc apparaitre dans la version suivante livrée par le presta. Donc, surtout n'hésite pas à intervenir sur du DDL livré de l'extérieur. Par expérience, je peux te dire que de nombreux logiciels développés sous DB2 par certaines sociétés, le sont sans l'apport de DBA et des fois, ça craint...

    Faut faire vite et pas cher, la qualité, basta !!! Tu me diras, c'est également la nouvelle devise de ma société, mais ceci est un autre problème...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. UPDATE avec sous requête de sélection avec regroupement
    Par Maxsen dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2008, 11h20
  2. Requete Update avec sous requete et jointure
    Par javaboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2007, 11h03
  3. Update avec sous-requêtre
    Par maxinfos dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/05/2007, 14h31
  4. Requete Update avec sous requete
    Par joziel dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/08/2006, 15h15
  5. problème update avec sous requetes
    Par stoz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/10/2005, 16h44

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