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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    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 expérimenté
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    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 Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    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 éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    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 Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    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 : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    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 confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    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 540
    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 éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    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.

  9. #9
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    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.

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

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    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.

  11. #11
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    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.

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