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

PHP & Base de données Discussion :

Requête trop longue à exécuter, trop de résultats


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Responsable Applicatif / Développeur
    Inscrit en
    Mai 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Responsable Applicatif / Développeur

    Informations forums :
    Inscription : Mai 2007
    Messages : 495
    Points : 110
    Points
    110
    Par défaut Requête trop longue à exécuter, trop de résultats
    Bonjour, je suis sous php 5 avec une bdd oracle.
    et j'ai une requête qui retourne 3 000 000 millions de résultats.
    pour l'instant j'essaye d'enregistrer dans un tableau et de poster le tableau page par page mais c'est trop long.

    Comment faire?
    Y a-t-il moyen d'exécuter la requête en plusieurs fois?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Homme Profil pro
    Responsable Applicatif / Développeur
    Inscrit en
    Mai 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Responsable Applicatif / Développeur

    Informations forums :
    Inscription : Mai 2007
    Messages : 495
    Points : 110
    Points
    110
    Par défaut
    merci, oui avec rownum je connais déjà mais le problème c'est que même si ça ne renvoi qu'une partie des résultat, bah ça exécute une requête aussi longue et il n'y a aucun gain de temps.

  4. #4
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    On peut avoir une idée du format de la requête exécutée ? Afin de voir s'il y a moyen de paginer "proprement" ?

  5. #5
    Membre régulier
    Homme Profil pro
    Responsable Applicatif / Développeur
    Inscrit en
    Mai 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Responsable Applicatif / Développeur

    Informations forums :
    Inscription : Mai 2007
    Messages : 495
    Points : 110
    Points
    110
    Par défaut
    C'est une requête toute simple :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
     Select * from AGENTS;

  6. #6
    Membre régulier
    Homme Profil pro
    Responsable Applicatif / Développeur
    Inscrit en
    Mai 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Responsable Applicatif / Développeur

    Informations forums :
    Inscription : Mai 2007
    Messages : 495
    Points : 110
    Points
    110
    Par défaut
    Sinon si vous avez une solution en java ça m’intéresse aussi.
    Merci

  7. #7
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    On pagine du résultat X à Y :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM (SELECT *, rownum AS rn FROM agents WHERE rownum <= :Y)
    WHERE rn >= :X
    Ca devrait déjà t'économiser (un peu) en mémoire ...

  8. #8
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    Tu peux certainement réduire la taille du résultat en réalisant un tri sur ta requête, et en récupérant la valeur du dernier courant pour le réinjecter dans le prochain.

    Typiquement, si tu peux afficher suivant un ID unique, trié de manière croissante. On veut par groupe de 10 résultats, sachant que le dernier résultat de la page d'avant avait l'ID Z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM agents WHERE id > :Z AND rownum <= 10 ORDER BY id ASC

  9. #9
    Membre régulier
    Homme Profil pro
    Responsable Applicatif / Développeur
    Inscrit en
    Mai 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Responsable Applicatif / Développeur

    Informations forums :
    Inscription : Mai 2007
    Messages : 495
    Points : 110
    Points
    110
    Par défaut
    en fait j'avais déjà testé cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM (SELECT *, rownum AS rn FROM agents WHERE rownum <= :Y)
    WHERE rn >= :X
    en effet ça n'affiche qu'une partie du résultat, mais par contre la requête complète se fait quand même et est aussi lourde.

    là je suis en train de chercher du coté des FETCH et CURSOR mais sans résultat pour l'instant

  10. #10
    Membre régulier
    Homme Profil pro
    Responsable Applicatif / Développeur
    Inscrit en
    Mai 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Responsable Applicatif / Développeur

    Informations forums :
    Inscription : Mai 2007
    Messages : 495
    Points : 110
    Points
    110
    Par défaut
    Quelqu'un a une idée autre qu'avec Rownum ? même dans un autre langage.

    Je me demandais quand même s'il n'y avait aucun moyen de faire une pause sur le traitement de la requête et de la reprendre après? ou équivalent.

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Il y a des index sur la table? Ça semble bizzare que le SGBD fasse une requête fullscan même si tu poses des limites aux résultats.

Discussions similaires

  1. [Optimisation] Trop longue exécution
    Par Friedrick dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/02/2008, 14h58
  2. Exécution trop longue d'une requête
    Par lodan dans le forum Requêtes
    Réponses: 5
    Dernier message: 13/10/2006, 15h34
  3. CGI exécution trop longue
    Par crochepatte dans le forum Web
    Réponses: 6
    Dernier message: 23/08/2006, 15h11
  4. CGI exécution trop longue
    Par crochepatte dans le forum Apache
    Réponses: 3
    Dernier message: 18/08/2006, 15h02
  5. Requete trop longue à exécuter
    Par fguilbert dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/06/2006, 10h33

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