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 :

COUNT APRES UN SELECT DB2


Sujet :

DB2

  1. #1
    Membre du Club Avatar de clodo13
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 67
    Points : 58
    Points
    58
    Par défaut COUNT APRES UN SELECT DB2
    Bonjour,

    J'ai une requête de select, je veux compter le nombre de ligne retournées sans utilisé un count.

    Y aurait-il un moyen d'obtenir le nombre de ligne dans un programme (comme avec sqlca.sqlerrd[2] ) pour obtenir le nombre de ligne sélectionnées.

    Ou dans une même requête obtenir les données et le nombre de lignes totales ?


    Merci.

  2. #2
    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
    Quelle version ? Quelle plate-forme ?
    Tu dis que tu veux l'obtenir dans un programme comme un sqlca.sqlerrd[2]. Pourquoi ne l'utilises-tu pas ?

  3. #3
    Membre du Club Avatar de clodo13
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par K2R400 Voir le message
    Quelle version ? Quelle plate-forme ?
    Tu dis que tu veux l'obtenir dans un programme comme un sqlca.sqlerrd[2]. Pourquoi ne l'utilises-tu pas ?
    Je ne connais pas la version de mon os pour l'instant.
    Il semble que sur ma version MVS, sur les update et delete la valeur de sqlca.sqlerrd[2] est modifié sur le select elle est vide je crois ou à -1;

    Je lance des requete SQL à partir d'un service CICS en langage C.

  4. #4
    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 à ton besoin, tu peux te servir des scrollables curseurs. Ce type de curseur te permet de te ballader dans tous les sens dans ton curseur au lieu de lire ton curseur ligne après ligne de manière standard. Le besoin fonctionnel est très limité... Ceci dit, avec les options qui vont bien, cela signifie que DB2 stocke automatiquement le résultat du curseur dans sa database de travail, il connait donc le nombre de ligne ramené dès l'OPEN.

    Les actions à faire :

    1/ Déclarer le curseur ainsi

    DECLARE Nom_curseur INSENSITIVE SCROLL CURSOR FOR SELECT ...

    2/ Après l'OPEN Nom_curseur, faire un FETCH ABSOLUTE +1000000 pour se positionner en fin de curseur (le +1000000, c'est aléatoire, mettre une valeur qui ne sera jamais atteinte pour être certain de se retrouver en fin de curseur).

    3/ Après ce FETCH ABSOLUTE, la zone SQLERRD(2) contient le nombre de lignes du curseur.

    4/ Se repositionner au début du curseur et faire ensuite une lecture standard ligne après ligne.

    Cela répond bien au besoin et ça coute moins cher, en terme de perfs, que de faire un SELECT COUNT(*) puis le curseur standard.

    Sauf erreur de ma part, si tu es en V8, il te faudra déclarer une database temporaire pour pouvoir te servir des scrollables curseurs. Si tu es en V9, ce n'est plus nécessaire.

    Bonne utilisation et à ta disposition.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Mais, pour connaître le nombre de ligne retournées par une SELECT, ne peut-on donc pas utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exec sql GET DIAGNOSTICS :rcount = DB2_NUMBER_ROWS
    juste après l'open ?

    Le nombre de lignes sélectionnées est renvoyé dans la variable rcount avec cette fonction SQL. On éviterait ainsi le fetch.

  6. #6
    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
    Pb : si pas de tri dans le curseur, DB2 ne fait rien au moment de l'OPEN et la lecture des lignes se fait pendant les fetchs. Donc, tu n'as pas le nbre de lignes à l'OPEN.

    C'est pour cette raison que nous nous sommes servis d'un scrollable cursor quand nous avons eu le même besoin : avec un scrollable cursor, on est certain que DB2 fait tout le boulot au moment de l'OPEN.

    C'est d'ailleurs la seule permission d'utilisation d'un scrollable cursor dans ma société, car si on commence à s'amuser avec ces trucs avec l'option sensitive, bonjour la complèxité des traitements et les performances...

  7. #7
    Membre du Club Avatar de clodo13
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par pdz74 Voir le message
    Pb : si pas de tri dans le curseur, DB2 ne fait rien au moment de l'OPEN et la lecture des lignes se fait pendant les fetchs. Donc, tu n'as pas le nbre de lignes à l'OPEN.

    C'est pour cette raison que nous nous sommes servis d'un scrollable cursor quand nous avons eu le même besoin : avec un scrollable cursor, on est certain que DB2 fait tout le boulot au moment de l'OPEN.

    C'est d'ailleurs la seule permission d'utilisation d'un scrollable cursor dans ma société, car si on commence à s'amuser avec ces trucs avec l'option sensitive, bonjour la complèxité des traitements et les performances...
    Merci pour votre réponse tres pertinente.
    En effet, je ne pouvais pas utiliser de count(*) car ma base de donnée contient 200 millions d'enregistrement.

    Le Fetch c'est la bonne solution pour ne pas ralentir les traitements.

  8. #8
    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 clodo13 Voir le message
    Merci pour votre réponse tres pertinente.
    En effet, je ne pouvais pas utiliser de count(*) car ma base de donnée contient 200 millions d'enregistrement.

    Le Fetch c'est la bonne solution pour ne pas ralentir les traitements.
    Bonjour,

    Je ne comprends pas la pertinence de cette réponse.

    Pour se baser en fin d'un curseur, on est obligé d'exécuter la requête non ?

    Qui plus est, sur une clause select complexe les résultats ramenés pour faire ce genre de count est plus couteux en ressource comparé à un count(*).

    J'ai du louper une étape dans la démarche mais je ne sais pas laquelle :p

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Citation Envoyé par pdz74
    Pb : si pas de tri dans le curseur, DB2 ne fait rien au moment de l'OPEN et la lecture des lignes se fait pendant les fetchs. Donc, tu n'as pas le nbre de lignes à l'OPEN.
    Là, tu m'étonnes ! Dans la mesure où le curseur est ouvert en mode INSENSITIVE, le GET DIAGNOSTICS formulé comme affiché dans mon post précédent devrait bien renvoyer les nombre de lignes à lire.

  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 Mercure Voir le message
    Là, tu m'étonnes ! Dans la mesure où le curseur est ouvert en mode INSENSITIVE, le GET DIAGNOSTICS formulé comme affiché dans mon post précédent devrait bien renvoyer les nombre de lignes à lire.
    Mercure,

    en INSENSITIVE c'est forcé qu'il y ait le Nbr de lignes derrière un GET DIAGNOSTIC car avec un curseur INSENSITIVE la totale des données sont dupliquées lors d'un OPEN. Ce n'est pas le cas d'un curseur ASENSITIVE ou SENSITIVE. Maintenant avec des curseurs de type SCROLLABLE, attention aux performances, c'est déconseillé.

    Punkoff,

    tu as tout juste et tes remarques sont pertinentes.

    Clodo13,

    Je te conseille plutôt de créer un EVI (index de type bitmap/vecteur) sur les colonnes de ta clause WHERE et de faire un SELECT COUNT(*). La réponse devrait être instantannée.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Mais AMHA ce SCROLL ne sert à rien et NO SCROLL est sauf erreur pris par défaut dans la clause DECLARE CURSOR.
    GET DIAGNOSTICS renverra bien le nombre de lignes sélectionnées dans la mesure où le curseur est ouvert en mode INSENSITIVE, qu'il soit "scrollable" ou pas.

    +1 pour l'EVI mais je crois que pas possible sous z/OS, je veux dire que je n'en suis pas sûr.

  12. #12
    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 Mercure Voir le message
    Mais AMHA ce SCROLL ne sert à rien et NO SCROLL est sauf erreur pris par défaut dans la clause DECLARE CURSOR.
    GET DIAGNOSTICS renverra bien le nombre de lignes sélectionnées dans la mesure où le curseur est ouvert en mode INSENSITIVE, qu'il soit "scrollable" ou pas.

    +1 pour l'EVI mais je crois que pas possible sous z/OS, je veux dire que je n'en suis pas sûr.
    Exact. La notion de curseur SCROLLable ne sera pas necessaire ici . Un curseur INSENSITIVE (qui est par nature en lecteur seule) est un moyen d'isoler les données sans gérer la notion de transaction.
    Ce genre de curseur peut être assez pénalisant côté perfs, toutes les données sont dupliquées au moment de l'OPEN d'où la connaissance exacte du nombre de lignes concernées dès l'OPEN avec un GET_DIAGNOSTIC.
    Pour les autres types de curseurs (ASENSITIVE ou SENSITIVE), le GET_DIAGNOSTIC ne renverra qu'un nombre approximatif de lignes. Cette information est fournie par le "statistic manager" (appelé par lui même par l'optimiseur) qui peut s'appuyer sur des EVIs, de l'échantillonage d'index b-tree, des statistiques de colonnes voire des prédicats tout fait (Exemple : avec un WHERE A=1 --> 10% de lignes estimées, WHERE A>=1 --> 33% des lignes etc...) en l'absence d'index ou de statistiques.

    Pour conclure, plusieurs moyens pour obtenir le nombre de lignes concernées par la requête avec des temps de réponse plus ou moins bons :

    - Le count(*)
    - Curseur INSENSITIVE avec GET_DIAGNOSTIC après l'OPEN
    - Curseur SCROLLABLE avec un FETCH RELATIVE maximal suivi d'un GET_DIAGNOSTIC

    Il va sans dire qu'avec un bon index (de type EVI), seule la première solution offrira les meilleurs temps de réponse quelque soit le nombre de lignes concernées.
    Pour les deux autres solutions, il vaut mieux espérer que le nombre de lignes à compter est faible afin d'obtenir des temps de réponse acceptables.

  13. #13
    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
    Citation Envoyé par K2R400 Voir le message
    ... Je te conseille plutôt de créer un EVI (index de type bitmap/vecteur) sur les colonnes de ta clause WHERE et de faire un SELECT COUNT(*). La réponse devrait être instantannée.
    Attention à la plateforme ... En DB2 z/OS un index de type EVI ça n'existe pas ...

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Merci Luc pour la confirmation sur la faisabilité EVI sous z/OS dont je doutais.

  15. #15
    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 Luc Orient Voir le message
    Attention à la plateforme ... En DB2 z/OS un index de type EVI ça n'existe pas ...
    Dommage et au temps pour moi

  16. #16
    Membre du Club Avatar de clodo13
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par K2R400 Voir le message
    Dommage et au temps pour moi
    J'ai compté le nombre de ligne au moment du fetch pour ne pas exécuter une commande de count ou de diagnostic.
    C'est la meilleure solution qui me permet de remonter le données et de compter le nombre d'occurences.

    Voila.

  17. #17
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    clodo13,

    Pour mon information, je serais tout de même curieux de savoir si le GET DIAGNOSTICS te donne les mêmes résultats car avec GET DIAGNOSTICS on évite de fetcher toutes les lignes sélectionnées par SELECT pour faire un simple comptage.

    Peux-tu l'essayer et nous dire, please ?

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

Discussions similaires

  1. Modification d'un textarea d'après un select
    Par Vilfago dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 07/12/2006, 17h27
  2. Remplir un formulaire après la selection dans un combobox
    Par creale10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/09/2006, 10h51
  3. Réponses: 6
    Dernier message: 11/09/2006, 00h34
  4. afficher une liste deroulante après une selection
    Par zana74 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 04/08/2006, 17h18
  5. [JPox] NullPointerException aprés un SELECT
    Par MinsK dans le forum Persistance des données
    Réponses: 3
    Dernier message: 05/07/2005, 13h46

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