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 :

Optimiser une requête gourmande


Sujet :

DB2

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut Optimiser une requête gourmande
    Bonjour,

    nous un job de production qui fait de l'archivage d'une table de 600 Millions de lignes. Dans le job il y a la requête suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM RDF.TABL             
    ORDER  BY SAR.ITS ASC, SAR.ITE DESC;
    Le programme utilisé est le DSNTIAUL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DSN SYSTEM(DB2R)                                  
    RUN  PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) PARM('SQL')
    Le SYSREC00 est un fichier sur K7 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //SYSREC00 DD DSN=GRDT.UTIKL.ARCH,VOL=(,,,10),   
    //        DISP=(,CATLG,KEEP),UNIT=VTS2,LABEL=RETPD=999,   
    //        DCB=(RECFM=FB,LRECL=00053,BLKSIZE=27984)        
    //SYSPUNCH DD DUMMY
    Je pense qu'un select * sur une table de 600 Millions de lignes n'est trsè recommandé en production.
    Quel est votre avis ?
    Est-il possible d'améliorer cela en utilisant par exemple un UNLOAD DB2 ou autre.

    Merci d'avance pour vos suggestions.

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    ORDER BY sur 600m de lignes, les admin vont te tomber dessus.

    Pour décharger des données en masse, l'utilitaire UNLOAD est bcp plus rapide.

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    C'est pourtant ce que l'on en production...
    Et encore, je suis tombé dessus un peu par hasard...

    Quelle est exactement la différence entre un select * avec order by et un select sans order by (au niveau CPU et résulat). Il me semble que le résultat est trié,c'est bien cela ?

    Je pense effectivement que l'unload est plus rapide. mais le fichier résultat n'est pas sous la même forme. tu me confirmes ?

  4. #4
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Ton archivage se trouve sur une autre table ?
    Si c'est le cas tu décharges via l'utilitaire Unload et tu recharges la nouvelle table avec ce fichier.

    Si c'est de l'archivage sur Disque, cela revient au même, tu décharges via Unload et tu pourras recharger si besoin avec ce fichier, ne pas oublier de garder le fichier syspunch (cela permet de recharger correctement, surtout si il y a évolution du DDL).

    Je ne vois pas l’intérêt du order by si c'est pour de l'archivage.

    Bon courage

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 944
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Ayant été confronté à ce type de probléme dans le passé, je suis passé à une autre méthode "Le travail par Année". en effet, pour chaque année, il y a création de tables correspondant à l'année en cours codifier de cette maniére exple "ACHAT2014","PRODUTION2014 " , "VENTE2014", pour les solde des stock anterieur est il sont transféré automatiquement .

  6. #6
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Bonjour,

    Ayant été confronté à ce type de probléme dans le passé, je suis passé à une autre méthode "Le travail par Année". en effet, pour chaque année, il y a création de tables correspondant à l'année en cours codifier de cette maniére exple "ACHAT2014","PRODUTION2014 " , "VENTE2014", pour les solde des stock anterieur est il sont transféré automatiquement .
    C'est souvent le cas mais créer manuellement chaque nouvelle année est un peu lourd. Un tablespace partitionné par année est plus facile a mettre en place et a maintenir.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 944
    Points : 123
    Points
    123
    Par défaut
    @arneo,

    tu m'a pas compris , je crée pas manuellement mes tables tout le contraire. Ma méthode ce base sur la duplication de fichier. en effet j'ai des fichiers de base utilisés pour les copie/coller avec cette méthode
    ///ici pour le copie d'une base de données Interbase
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    procedure TForm1.SAISIEClick(Sender: TObject);
    var
         i,j:pchar;
         rep,s:shortstring;
         i1,j1:string;
         k:longbool;
    begin
             s:=ExtractFilePath(fdm.IBDOS.DatabaseName)+'S'+fdm.DOS.FieldValues['num']+exe.Text+'.gdb';
          IF (not FDM.IBSAISIE.Connected)or(FDM.IBSAISIE.DatabaseName<>s) then
          begin
               if not fileexists(s) then
               begin
    //                 rep:=copy(application.ExeName,1,length(application.ExeName)-10);
      //               ForceDirectories(copy(application.ExeName,1,length(application.ExeName)-10)+'tmp');
                     rep:=ExtractFilePath(fdm.IBDOS.DatabaseName);
                     ForceDirectories(rep+'tmp');
                     i1:=rep+'saisie.gdb';
                     j1:=rep+'tmp\saisie.gdb';
                     i:=PChar(i1);j:=pchar(j1);
                     copyfile(i,j,true);
                     renamefile(j1,rep+'tmp\S'+fdm.DOS.FieldValues['num']+exe.Text+'.gdb');
                     i1:=rep+'tmp\S'+fdm.DOS.FieldValues['num']+exe.Text+'.gdb';
                     j1:=rep+'S'+fdm.DOS.FieldValues['num']+exe.Text+'.gdb';
                     i:=PChar(i1);j:=pchar(j1);
                     copyfile(i,j,k);
                     deletefile(rep+'tmp\S'+fdm.DOS.FieldValues['num']+exe.Text+'.gdb');
                     removedir(rep+'tmp');
               end;
               WITH fdm do
               begin
                     IBSAISIE.connected:=false;
                     SAISIE.Filtered:=false;
                     IBSAISIE.databasename:=s;
                     IBSAISIE.connected:=true;
                     SAISIE.Open;
               end;
     
          end;
    end;

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par sam01 Voir le message
    C'est pourtant ce que l'on en production...
    Et encore, je suis tombé dessus un peu par hasard...

    Quelle est exactement la différence entre un select * avec order by et un select sans order by (au niveau CPU et résulat). Il me semble que le résultat est trié,c'est bien cela ?

    Je pense effectivement que l'unload est plus rapide. mais le fichier résultat n'est pas sous la même forme. tu me confirmes ?
    La différence est en effet le tri interne à DB2.

    Un Unload Tablespace et un tri (utilitaire Sort) peut être plus simple et sollicitera moins le DB2

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 763
    Points : 10 738
    Points
    10 738
    Par défaut
    Citation Envoyé par sam01 Voir le message
    Quelle est exactement la différence entre un select * avec order by et un select sans order by (au niveau CPU et résulat). Il me semble que le résultat est trié,c'est bien cela ?
    Effectivement la différence c'est le tri des données sur les critères de l'order by; Cette instruction est généralement proscrite de toute requête. Mieux vaut passer ensuite par des tris fichiers.

  10. #10
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Je me permets de ressortir ce post.
    J'aimerais savoir si ce step en question (qui dure donc très longtemps) est cancelé, est-il possible de le reprendre où il en était ou bine faut-il tout reprendre depuis le début ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    pas de "restart" possible.

    dans db2, trier 600m de lignes n'est pas normal.

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Février 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Je confirme la solution de UNLOAD.

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Darkzinus Voir le message
    Effectivement la différence c'est le tri des données sur les critères de l'order by; Cette instruction est généralement proscrite de toute requête. Mieux vaut passer ensuite par des tris fichiers.
    Non l'order by n'est pas généralement proscrit, bien heureusement

    Par contre, il faut avoir s'il correspond ou non à un index, si pas d'index et que le volume traité est conséquent, alors, oui, c'est à éviter.
    Il en va de même pour les clauses group by et distinct qui induisent aussi un tri.

Discussions similaires

  1. Optimiser une requête de "classement"
    Par Manu0086 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/03/2006, 19h47
  2. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 10h41
  3. Optimiser une requête..est-ce possible ?
    Par Thierry8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/09/2005, 12h31
  4. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 21h55

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