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

SQL Oracle Discussion :

Equivalence found_rows Oracle 10g


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut Equivalence found_rows Oracle 10g
    Bonjour à tous,

    étant donné que found_rows ne fonctionne plus sous 10g, existe-t-il un équivalent ?

    Merci d'avance

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je ne pense pas que je comprend, peux tu donner quelques détails.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    En fait j'avais besoin de connaitre le nombre de résultat d'une requête.

    J'ai utilisé une fonction analytique qui a des perfs corrects.

    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
    SELECT *
      FROM (
             SELECT DISTINCT
               TA.icone_type_agence,
               TA.Nom_type_agence,
               AG.id_presto,
               AG.id_agence,
               AG.raison_social_agence,
               AG.code_postal_agence,
               AG.ville_agence,
               AG.password_agence,
               AG.telephone_agence,
               SL.icone_statut_logiciel,
               SL.nom_statut_logiciel,
               LG.nom_logiciel,
               ROW_NUMBER() OVER (ORDER BY AG.id_presto) num,
               count(*) OVER() count_annonce
              FROM
              TYPE_AGENCE TA,
              AGENCE AG,
              AGENCE_REMONTEE AR,
              STATUT_LOGICIEL SL,
              LOGICIEL LG
              WHERE TA.id_type_agence = AG.id_type_agence
                AND AG.id_presto = AR.id_presto(+)
                AND AG.id_logiciel = LG.id_logiciel
                AND LG.id_statut_logiciel = SL.id_statut_logiciel
                AND AG.id_statut_agence > -1
           )
     WHERE num BETWEEN 1 AND 10
    S'il existe qq chose de mieux je suis preneur

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Hm, essayez avec une table plus grande et dit moi si les perfs restent toujours correcte.

    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
    Connecté à :
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    JServer Release 9.2.0.5.0 - Production
    
    SQL> set timing on
    SQL> Select count(*)
      2  From big_table;
    
      COUNT(*)
    ----------
       1052736
    
    Ecoulé : 00 :00 :09.99
    
    SQL> l
      1  Select * From(
      2    Select t.*, count(*) over()
      3      from big_table t
      4    )
      5* Where rownum < 10
    
    ...  
    9 ligne(s) sélectionnée(s).
    
    Ecoulé : 00 :01 :10.11

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Hm, essayez avec une table plus grande et dit moi si les perfs restent toujours correcte.

    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
    Connecté à :
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    JServer Release 9.2.0.5.0 - Production
    
    SQL> set timing on
    SQL> Select count(*)
      2  From big_table;
    
      COUNT(*)
    ----------
       1052736
    
    Ecoulé : 00 :00 :09.99
    
    SQL> l
      1  Select * From(
      2    Select t.*, count(*) over()
      3      from big_table t
      4    )
      5* Where rownum < 10
    
    ...  
    9 ligne(s) sélectionnée(s).
    
    Ecoulé : 00 :01 :10.11
    Je pense que le select count(*) reste la meilleure solution, mais comment l'intégrer à la requête principale ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est juste une idée, mais peut-être quelque chose de la forme suivante :

    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
    select
        (select count(*)
        FROM
              TYPE_AGENCE TA,
              AGENCE AG,
              AGENCE_REMONTEE AR,
              STATUT_LOGICIEL SL,
              LOGICIEL LG
              WHERE TA.id_type_agence = AG.id_type_agence
                AND AG.id_presto = AR.id_presto(+) -- C'est mal !
                AND AG.id_logiciel = LG.id_logiciel
                AND LG.id_statut_logiciel = SL.id_statut_logiciel
                AND AG.id_statut_agence > -1) found_row,
        ... -- le reste du select
    AND rownum < 10

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par shadeoner Voir le message
    Je pense que le select count(*) reste la meilleure solution, mais comment l'intégrer à la requête principale ?
    Count(*) coûte rélativement cher. Donc la meilleur solution c'est de s'en passer. Mais, bon, que est-ce que t'as besoin de faire et dans quelles conditions ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    En gros je rapatrie de la m à la nième. lignes et j'ai besoin de connaitre le nombre total si je n'avais pas eu la limite pour créer la pagination

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    Citation Envoyé par Waldar Voir le message
    C'est juste une idée, mais peut-être quelque chose de la forme suivante :

    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
    select
        (select count(*)
        FROM
              TYPE_AGENCE TA,
              AGENCE AG,
              AGENCE_REMONTEE AR,
              STATUT_LOGICIEL SL,
              LOGICIEL LG
              WHERE TA.id_type_agence = AG.id_type_agence
                AND AG.id_presto = AR.id_presto(+) -- C'est mal !
                AND AG.id_logiciel = LG.id_logiciel
                AND LG.id_statut_logiciel = SL.id_statut_logiciel
                AND AG.id_statut_agence > -1) found_row,
        ... -- le reste du select
    AND rownum < 10
    Merci pour ton aide, le problème c'est qu'il va me faire 10 fois le select count

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je ne pense pas car la requête simulant le found_rows n'est pas liée avec le reste de la requête, et le résultat devrait être mis en cache une seule fois.

    Essayez-là et dites-moi

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    j'ai testé, j'ai exactement le même coût en utilisant la fonction analytique.

    Edit : j'ai l'impression qu'il ne tient pas compte de cela dans son plan d'execution

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En faisant la requête sur une table simple (2 millions de lignes, pas d'index), j'ai un temps de réponse de 1.75 sec pour ma requête contre 6.2 sec pour celle utilisant la fonction analytique.

    Maintenant en prenant en compte les jointures, celà peut effectivement modifier les résultats.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    Oui, je pense que je vais garder cette méthode

    Je suis curieux et perfectionniste, si quelqu'un trouve une façon plus rapide, je suis preneur

    Merci pour votre aide à tous.

  14. #14
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Salut,
    Citation Envoyé par shadeoner Voir le message
    En gros je rapatrie de la m à la nième. lignes et j'ai besoin de connaitre le nombre total si je n'avais pas eu la limite pour créer la pagination
    Je ne comprends pas très bien ta phrase, mais pour ta culture personnelle je te refourni le lien vers asktom donné par mnitu dans une précédente discussion sur la pagination.
    Bon c'est toufu, il y a environ 6 ans de posts, mais si tu cherches "google" dans la page tu verras ce que préconise Tom Kyte sur ce thème.
    Pour résumer, un accès direct "dernière page" est inutile car :
    1) les utilisateurs vont raremant plus loin que la 2eme ou 3eme page (et encore je suis large ).
    2) le temps de réponse augmente page après page, donc pour les dernières ...
    3) google est la référence et google ne le fais pas (j'aime beaucoup cet argument )

    Evidemment ce sont des préconisations pour un moteur de recherche, je ne connais pas la finalité de ta requête mais ça peut quand même t'intéresser.

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

Discussions similaires

  1. Equivalent sous Oracle d une option SQLServer
    Par Pasiphae dans le forum Oracle
    Réponses: 3
    Dernier message: 19/11/2004, 18h30
  2. Installation ORACLE 10g sous XP Pro
    Par DUCORROY dans le forum Oracle
    Réponses: 7
    Dernier message: 21/10/2004, 10h08
  3. Installation Oracle 10g sous Windows 2000
    Par Jeff206 dans le forum Oracle
    Réponses: 6
    Dernier message: 24/08/2004, 16h51
  4. [ORACLE 10g Linux] Pbm de connexion avec un Client winXP
    Par zarbiwayne dans le forum Administration
    Réponses: 26
    Dernier message: 20/08/2004, 23h37

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