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 :

select * d'une table énorme


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 select * d'une table énorme
    Bonjour,

    nous venons de nous apercevoir qu'un job dure anormalement longtemps.

    Et quand on regarde le programme, on s'aperçoit qu'il y a un select * qui balaye donc toute la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
         SELECT *                                                 
         FROM CFVTP                                               
         ORDER BY XAX,BTP,JKP,BDF,             
                  NHY,LPM,HDT,NHP             
         FOR FETCH ONLY ;
    La table en question fait plus de 500 Millions de lignes.

    Mes question sont les suivantes :

    Est-il normal en production de balayer la totalité d'une table qui à cette taille ?

    La requête dure 4 heures. Y a-t'il un moyen de l'optimiser ?

    Merci pour votre aide.

    Existe t'il un moyen efficace de détecter les requêtes qui consomment trop ?

    Merci pour votre aide.

  2. #2
    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
    Bonjour,

    Pour répondre à tes différentes questions.

    Est-il normal de scanner une table de cette grosseur -> Ca, seul le responsable d'appli peut te répondre. Ca peut malheureusement être normal, ça peut aussi être un moyen simple de ne pas chercher à analyser le besoin réel et d'éliminer les lignes inutiles de manière applicative plutôt que par une clause Where.

    Y'a t-il un moyen de l'optimiser. Ca vaut le coup de se poser la question de l'ORDER BY. Est-il utile ? Si la table est vraiment énorme, ça peut même faire exploser la DSNDB07. A moins qu'il n'existe un index sur les colonnes de tri et que DB2 se serve de cet index pour réaliser son tri. Mais dans ce cas, cela signifie double scan de la table et de l'index. Dans tous les cas, ton tri est consommateur. Pour info, le tri MVS est plus rapide que le tri DB2.

    Autre axe d'optimisation : tu remplaces le programme de mise à plat par l'utilisation de l'utilitaire UNLOAD qui est beaucoup plus rapide qu'un programme. Si en plus, tu as des zones en VARCHAR, tu ajoutes le paramètre NOPAD, histoire d'optimiser l'espace disque nécessaire et le temps d'écriture disque.

    Quant à analyser les requêtes consommatrices, il y a de nombreux outils sur le marché, certains se contentant de tracer les programmes et de sortir toutes statistiques utiles, d'autres te donnant des conseils et axes d'optimisation, ... La liste est longue, il faudrait donc cibler ton besoin.

    A ta disposition et n'hésite pas à nous donner des infos complémentaires.

  3. #3
    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
    chez nous, un programme qui fait "SELECT *" sur 500M de lignes avec un order by, c'est retour à l'envoyeur (au développeur).

    De plus, avec un order by de ce type, db2 peut choisir de passer par un index pas du tout optimal pour ce genre de requete.

    a+

  4. #4
    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
    Merci beaucoup pour vos réponses.

    Je vas peut-être plus me tourner vers un unload de la table comme le préconise pdz74 (merci au passage pour tes remarques pertinentes, notament le coup de NOPAD que je ne connaissais pas ).

    Je suis de ton avis bernard59139 pour faire un retour à l'envoyeur, le souci c'est que l'on pas de garde fous à ce sujet.

    Je pense que les programmes sont testés (si on peut appeler ça tester..) dans des petits environnements de test avec des petites volumétries, et quand ça passe en prod ça fait des catastrophes.

    Je ne sais comment vous faîtes chez vous (dans votre société) pour vous prémunir de ce genre de désagréments.. je pense que c'est impossible de scanner tous les programmes qui arrivent en production...

  5. #5
    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
    chez nous, il y a quelques garde-fou, pas toujours efficaces.
    ces garde-fou ne sont que des programmes maison, avec des bugs, et tous les cas possibles ne sont pas pris en compte.

    ensuite, nous avons des "recommandations". Certaines doivent impérativement être suivies (pas de SELECT *), d'autres ne sont que de simples conseils (pas de ORDER BY). Toutes les recommandation peuvent conduire à une réécriture obligatoire du programme.
    Le tout fait partie des "normes de developpements" consignées dans des doc officielles.

    Et comme toi, on s'appercoit de certains problèmes que quand le prog arrive en PROD.

  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
    Citation Envoyé par sam01 Voir le message
    Je suis de ton avis bernard59139 pour faire un retour à l'envoyeur, le souci c'est que l'on pas de garde fous à ce sujet.

    Je pense que les programmes sont testés (si on peut appeler ça tester..) dans des petits environnements de test avec des petites volumétries, et quand ça passe en prod ça fait des catastrophes.

    Je ne sais comment vous faîtes chez vous (dans votre société) pour vous prémunir de ce genre de désagréments.. je pense que c'est impossible de scanner tous les programmes qui arrivent en production...
    Salut,

    Perso, on avait une image de la prod (pré-prod) et on faisait tourner au moins une fois tous les programmes livrés. Ca ne permet pas de se prémunir de tous les problèmes mais au moins des problèmes foireux du genre de ta requête ...

    Ensuite il existe toujours une période de garantie, suite à la livraison de ton prog par la SSII, donc la faut checker les stats de l'AS suite à une mise en prod... y a pas de secret.

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut Sam01 lorsqu'on apprend le langage SQL on déconseille clairement de faire un "select *"
    Avec une clause where ce serait peut-être plus rapide...
    c'est parfaitement logique que si tu veux sélectionner toutes les 500 millions de lignes de ta base de donnée ça va prendre du temps
    Citation Envoyé par sam01 Voir le message
    Est-il normal en production de balayer la totalité d'une table qui à cette taille ?
    pas du tout c'est presque illogique.
    Je ne comprends pas pourquoi on balaie comme ça les 500millions de lignes.
    Le langage SQL c'est spécialement conçu pour sélectionner les enregistrements voluus
    Dans une application on ne fait quasiment jamais de select *

  8. #8
    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
    Merci beaucoup pour vos retours d'expériences, je me disais que ce n'était pas normal...

    C'est vrai qu'un unload est beaucoup plus simple et moins consommateur, le souci c'est qu'il y pas mal de développeur qui ne connaissent pas les outils de production (unload PAR EXEMPLE), et donc ils restent dans bulle et font des select à gogo !

  9. #9
    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
    ils restent dans bulle
    là, je ne suis pas d'accord.
    conclusion trop rapide.

  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 suis d'accord, ne généralisons pas, mais c'est du vécu...

  11. #11
    Nouveau membre du Club
    Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Je confirme: en tant que développeur, on est balancé sans préparation et pratiquement aucune formation.
    Ensuite on se forme sur le tas en suivant ce que font les collègues qui eux aussi ont appris sur le tas...

  12. #12
    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
    Bah je pense que c'est ainsi dans quasiment toutes les branches.
    Pas le temps de former convenablement donc on laisse faire des conneries au jeunes débutant...
    Et c'est pas le pire, y'a aussi les anciens qui vont partir et dont on ne prépare pas le départ en faisant le transfère de connaissance et après on se plaint que personne ne sais comment faire ce que notre bon ancien faisait si bien sans que l'on s'en rende compte...

  13. #13
    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
    Citation Envoyé par bernard59139 Voir le message
    chez nous, un programme qui fait "SELECT *" sur 500M de lignes avec un order by, c'est retour à l'envoyeur (au développeur).

    De plus, avec un order by de ce type, db2 peut choisir de passer par un index pas du tout optimal pour ce genre de requête.

    a+
    Bonjour,

    désolé de revenir dessus mais voici ce que répond l'équipe qui analyse les performances :

    je cite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    on fait un SELECT * sans clause WHERE, on parcours toute la table.
    Ce qui aurait pu expliquer une durée excessive, c'est le ORDER BY ==> TRI
     
    Mais comme cette table contient 1 index qui contient toutes les colonnes de l'order by et dans le bon ordre,
     
    Pas d'amélioration possible côté DB2. L'étape traite 570 millions de lignes.
    Voilà .

    Je ne sais ce que vous en pensez, mais je trouve que l'explication n'est pas complète.
    Je ne comprends pas comment on peut dire qu'un select d'une table de
    570 Millions de lignes est normal...et en production en plus.

    J'ai besoin de vos avis, je présente peut-être mal la chose. Merci pour votre aide.

  14. #14
    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
    Sauf si l'index est très bien organisé, LEAFFAR = 0 et leafnear=0, et réellement, pas seulement avec des stat qui peuvent dater, le balayage de l'index peut prendre énormement de temps.

    Ensuite, DB2 est obligé d'accéder aux données. En passant par l'index et pour chaque ligne lue, il y a 1 accès index en sequence + 1 accès data en direct depuis l'index. ET là, attention au cluster ratio.

    Avec une requête similaire à ton exemple, dans certains de mes batchs, un TableScan d'une table de 300millions de lignes me prend 10m alors qu'une lecture par l'index me prend plus d'une heure. En pleine charge batch.

  15. #15
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Déjà, est-ce que l'analyse du chemin d'accès choisi par DB2 a été faite (fonction EXPLAIN) ?

    Ensuite, est-ce que tu es sûr que la majorité du temps d'exécution se situe bien dans cette requête et pas ailleurs ?
    Un outil comme STROBE ou TriTune devrait te donner la réponse.

  16. #16
    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
    Citation Envoyé par bernard59139 Voir le message
    Sauf si l'index est très bien organisé, LEAFFAR = 0 et leafnear=0, et réellement, pas seulement avec des stat qui peuvent dater, le balayage de l'index peut prendre énormement de temps.

    Ensuite, DB2 est obligé d'accéder aux données. En passant par l'index et pour chaque ligne lue, il y a 1 accès index en sequence + 1 accès data en direct depuis l'index. ET là, attention au cluster ratio.

    Avec une requête similaire à ton exemple, dans certains de mes batchs, un TableScan d'une table de 300millions de lignes me prend 10m alors qu'une lecture par l'index me prend plus d'une heure. En pleine charge batch.
    Bonsoir bernard59139 et merci pou ta réponse.

    Alors si j'ai bien compris,
    lors d'une telle requête, il y a 2 étapes :

    1) Balayage de tout l'index (donc 570 millions de lignes)

    2) Ensuite lecture ligne par ligne, d'abord l'index puis la ligne.


    DB2 doit prendre un temps fou à faire tout ça.

    Je ne sais si l'index est bien réorganiser...
    Comment connaître les valeurs de LEAFFAR et leafnear. Ce sont des colonnes e l'index ? Je vais chercher de mon côté.
    Il y a une chose qui m'interpelle dans ton message, c'est la notion de TableScan. Qu'est-ce que c'est exactement ? Puis remplacer le select * par un table scan en production ? (ou bien ce sont deux choses totalement différents ?)

    Je vais aussi en profiter pour répondre à Luc Orient.
    Un explain n' pas été fait. C'est compliqué à faire ? Aurais-tu un exemple de JCL pour effectuer un explain et comment l'interpréter ? (Là je prends de l'avance sur ma futur formation )

    Je ne suis pas du tout sûr que la majorité du temps est sur l'accès DB2 aucune trace n'a été faîte. On s'est juste apperçu que ce job prenait énormément de temps et en fouillant dans le programme, on est tombé sur ce fameux select *...

    Je ne suis pas au système alors je n'ai pas les outils pour...
    Je ne sais pas ce que l'on a la maison (STROBE ou TriTune ?) je vais me renseigner.

    Je trouve juste que la réponse que l'on m'a faîte est un peu limite. Nous avons en plus solliciter l'équipe de développement qui se charge de ce programme mais elle essaie d'éviter le sujet...

    Merci pour votre aide et vos précieux conseils.

  17. #17
    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
    1) Balayage de tout l'index (donc 570 millions de lignes)

    2) Ensuite lecture ligne par ligne, d'abord l'index puis la ligne.

    DB2 doit prendre un temps fou à faire tout ça.
    OUI, si tu passe par l'index, et si l'index est mal organisé (Near et Far leaf)

    Pour connaitre les stats sur Far et Near LEAF, consulte le catalog, sysindexpart je crois. Après un runstats si possible.
    Et pour comprendre leur importance, consulte la doc l'admin guide.

    pour apprendre l'EXPLAIN, je te conseille fortement de te faire expliquer online par un collègue. On peut écrire des bouquins rien que sur cet ordre SQL.
    le faire est une chose, interpreter le résultat en est une autre.
    Une 1ere approche est dans la doc SQL de db2.

  18. #18
    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
    Et, comme le fait remarque Luc Lorient, il faut être sur que la requête dure longtemps.

  19. #19
    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
    Citation Envoyé par bernard59139 Voir le message
    OUI, si tu passe par l'index, et si l'index est mal organisé (Near et Far leaf)

    Pour connaitre les stats sur Far et Near LEAF, consulte le catalog, sysindexpart je crois. Après un runstats si possible.
    Et pour comprendre leur importance, consulte la doc l'admin guide.
    Juste pour info,

    voici les valeurs de FAR et NEAR LEAF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LEAFNEAR: 1,375                      LEAFFAR : 0
    Le runstat date du 7 mais 2011.

  20. #20
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    L’intérêt ne serait'il pas d'analyser ce qui est fait de ce résultat?

    L'équipe vous répond simplement que côté DB2 ils ne peuvent rien faire... et je les comprends...

    Il est impensable de faire un SELECT * sur une table pareil...

    Pour reprendre régulièrement beaucoup de ces BATCH de 'développeur', 9 fois sur 10 il s'agit d'un traitement ligne à ligne en code client (JAVA,CSHARP etc.) avec même parfois un filtre fait côté client (donc trop tard).

    Je commencerais donc par analyser qui (quoi) fait cette requête et quoi sert son résultat...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/02/2007, 14h41
  2. Mettre un select dans une table
    Par bertlef dans le forum JDeveloper
    Réponses: 1
    Dernier message: 12/09/2006, 17h04
  3. [SQL]Select dans une table d'une autre base de données
    Par Didouille dans le forum Access
    Réponses: 3
    Dernier message: 21/12/2005, 09h00
  4. [MySQL] Affichage de valeurs par selection dans une table
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/12/2005, 17h04
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42

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