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 :

[Optimisation] SQL et boucles


Sujet :

PHP & Base de données

  1. #41
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    la j'aimerais bien lui dire "bon ecoute man, si tu veux t'arracher a trouver un truc qui fasse 2000000 iterations et qui manipule pleins de données vas y, mais pour moi la c de la perte de temps, je fais mon systeme de pagination, mon script marchera tres bien, et moon boulot sera fait ! "

    Oh comme j'aimerais bien !

  2. #42
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Petite correction Kirkis, je ne me suis pas trop penché sur l'algo de schnito. En fait je l'ai tout juste lu, car j'arrive pas à rentrer dedans. J'ai juste codé comme je l'aurais fait naturellement, from scratch. Maintenant peut-etre que l'algo de schnito est optimisable, je n'ai malheureusement pas le temps de le déchiffrer plus que ça.

  3. #43
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    je viens de modifier ma fonction getSqlValueRepeat, avec un array_slice et un array_count_values() .
    Ca donne ceci :

    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
     
    function getArraySqlValueRepeatTest($aPhp_ResultSql,$intSqlLine,$intSqlCol,$strContentCel)
    {
    	global $glb_aSqlCelSaveProp;
    	global $glb_intNbSqlLines;
     
    	global $glb_aSqlKeyCols;
     
    	$colId=$glb_aSqlKeyCols[$intSqlCol];
     
    	if($intSqlCol == 0)	//si on est a la 1ere colonne
    		$intSqlBorneSupPrecedent = $glb_intNbSqlLines;
    	else	//si on est a une autre colonne que la 1ere
    		//borne superieur = interval precedent
    		$intSqlBorneSupPrecedent = $glb_aSqlCelSaveProp[$intSqlCol-1]['INT_LIMIT_UPPER_PREVIOUS'] ;
     
     
    	/******* recherche pour l'interval precedent ********/
    	//portion de tableau = a l'interval precedent
    	$aPhp_ResultSqlCut=array_slice($aPhp_ResultSql[$colId],$intSqlLine,$intSqlBorneSupPrecedent-$intSqlLine);
    	$aNbRepetition=array_count_values($aPhp_ResultSqlCut);
    	/******* Fin recherche pour l'interval precedent ********/
     
    	return $aNbRepetition[$strContentCel];
    }
    Bon, ca fonctionne, mais j'ai pas encore testé niveau performance ...

    Par contre, un souci, c que j'ai des champs dans les tables qui sont vides, donc des valeurs de tableau vides également ...

    donc pour certaines entrées, j'ai une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    array_count_values(): Can only count STRING and INTEGER values!

    fait chier !

  4. #44
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    va falloir que je remplace les valeurs vides ... ca sera encore moins optimisé tout ca ...

  5. #45
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par schnito
    fait chier !
    Pourrais-tu modérer tes propos ? Il y a des âmes sensibles derrière ce forum.
    La langue française est assez riche pour te permettre d'exprimer ton mécontentement autrement que dans la vulgarité.

  6. #46
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Mr N.
    Citation Envoyé par schnito
    fait chier !
    Pourrais-tu modérer tes propos ? Il y a des âmes sensibles derrière ce forum.
    La langue française est assez riche pour te permettre d'exprimer ton mécontentement autrement que dans la vulgarité.
    certes ! mais cela reste tout de meme tres enervant ! saperlote !

    sinon, je viens de tester les performances ...

    Ancien algo : 58s
    Nouvel algo : 1min 10 ...

    trop cool c encore plus long .... mais euh !!

  7. #47
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    58s... tu sors d'où ce nombre ?

  8. #48
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    une date au tout debut de mon script.

    Ensuite, j'ai des tests de post, une generation de requete en fonction d'un tableau de select (l'utilisateur peut cocher une entete de tableau pour la supprimer)

    Ensuite, je genere la requete, je l'execute.

    Ensuite j'appelle ma fonction de traitement pour faire mon Tableau php pour le tableau HTML.

    une date juste derriere, suivie d'un die() ...

  9. #49
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Alors juste par curiosité :
    La requète que tu balances à mysql pour récupérer tes données, si tu fais un echo et que tu l'executes directement dans PhpMyAdmin ou mieux en ligne de commande, quel est le temps mis ?

  10. #50
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Alors je suis pas sous mySql, je suis sous Oracle ...

    Alors sous Oracle, l'affichage prends du temps, donc c pas tres evaluable ...

    Par contre, dans mon script, avec un die juste apres l'execution de la requete ==> 4s ...

  11. #51
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Je crois que c l'ecriture de la valeur lue dans le tableau SQL dans le tableau PHP pour le HTML qui prends le plus de temps ...

    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
     
    function writeValueTabHtml(&$aPhp_Html,$intHtmlLine,$intHtmlCol,$aPropertiesCel)
    {
    	global $glb_aHtmlCelSaveProp;
     
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['CLASS'] = $aPropertiesCel['CLASS'];
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['CONTENT'] = $aPropertiesCel['CONTENT'];
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['COLSPAN'] = $aPropertiesCel['COLSPAN'];
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['ROWSPAN'] = $aPropertiesCel['ROWSPAN'];
     
    	if($aPropertiesCel['TOTAL']!=true)
    $glb_aHtmlCelSaveProp[$intHtmlCol]['INT_LIGNE_WRITE_CEL_TOP']=$intHtmlLine;
     
     
    }

    - Sans (juste determiner les valeurs des cellules et rowspan) => 20s
    - Avec => 70 s


    Je crois que je vais devoir travailler la dessus ...

  12. #52
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    en allant un peu plus loin ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['CLASS'] = $aPropertiesCel['CLASS'];
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['CONTENT'] = $aPropertiesCel['CONTENT'];
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['COLSPAN'] = $aPropertiesCel['COLSPAN'];
    	$aPhp_Html[$intHtmlLine][$intHtmlCol]['ROWSPAN'] = $aPropertiesCel['ROWSPAN'];
    ca, ca me prends 50s ...

  13. #53
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Etant donné que j'ai 2 gros tableau en memoire :

    - le tableau SQL
    -le tableau PHP pour le HTML

    Le tableau PHP grandi au fur et a mesure et devient a son tout enorme.

    Alors, a chaque fois que j'ecris la valeur de mon tableau SQL dedans, je fais un unset de l'entrée dans mon tableau SQL ...

    Jme disais que j'allais liberer de la memoire ... pas mieux ...

  14. #54
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Bon en fait si, ca doit reduire le temps d'execution, mais ca pose un autre petit pb ... on verra ca lundi !

  15. #55
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Y a-t-il un équivalent de mysql_unbuffered_query sous PHP/Oracle ?
    Pour le coup, ça doit réduire considérablement les ressources utilisées, non ?

  16. #56
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Sous PHP 5 il est possible de le définir avec oci_set_prefetch() mais ça n'aidera pas vraiment...

    schinto, plutôt que de t'épuiser à essayer d'optimiser un code qui à l'évidence ne sera jamais rapide tu devrais essayer de le repenser totalement. Par exemple, j'ai survolé les 4 pages de ce topic mais je n'ai pas lu de description du but de tout ce code, qu'est-ce que tu veux réellement faire avec ces données ? Prends le problème à la base:
    • quelles sont les données de départ
    • quel est le résultat attendu
    • comment doit être présenté le résultat

    À partir de là, d'autres pourront certainement t'orienter vers un traitement plus efficace des données, et sûrement une présentation optimisée. D'ailleurs, pourquoi utiliser un tableau PHP pour stocker du HTML? ne peux-tu pas renvoyer une grosse chaîne HTML, ou --mieux encore-- l'afficher directement ?

  17. #57
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    * quelles sont les données de départ

    Un tableau SQL retourné par l'execution d'une requete avec une fonction oracle
    [*]quel est le résultat attendu

    Un tableau HTML, dans lequel on affiche les resultats de la requete, avec les bons rowspan piour chaque cellule (gestion des group by de la requete)

    [*]comment doit être présenté le résultat

    Un simple tableau HTML.


    En ce qui concerne mon algo, il a deja été bien pensé, je vois pas trop comment faire sans passer par mes boucles ...


    Citation Envoyé par Hubert Roksor
    D'ailleurs, pourquoi utiliser un tableau PHP pour stocker du HTML? ne peux-tu pas renvoyer une grosse chaîne HTML, ou --mieux encore-- l'afficher directement ?
    J'utilise un tableau PHP parce que je dois faire une fontion par etape, afin qu'elles soient reutilisables.
    Mon tableau PHP ne contient pas de HTML, il contient des contenu de cellule, c tout .

    etape 1 : execution de la requete
    etape 2 : transformation du tableau SQL en tableau PHP utilisable (une fontion avec des sous fonctions)
    etape 3 : parcours de ce tableau et affichage ...(une fontion avec des sous fonctions)

  18. #58
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Mmh, je me sens guère plus avancé

    Par exemple, ne pourrais-tu pas intégrer une partie du traitement à la boucle qui sert à récupérer le résultat de la requête ?

    Comment (pourquoi) sont groupées les lignes ? Je ne comprends pas "gestion des group by de la requete" désolé. Essaie de l'expliquer comme si personne ne connaissait ton script (une explication utile pourrait ressembler à "je récupère la liste des commandes de pièces détachées triées par fournisseur et j'affiche le nom de chaque fournisseur unique dans une seule cellule qui s'étend sur toutes les lignes correspondantes")

    Comme tu l'as souligné dans un précédent post, le tableau $aPhp_Html doit certainement prendre un temps considérable pour être généré. Les gros tableaus sont lents, les tableaux multi-dimensionnels sont très lents et les fonctions de type array_count() array_splice() ne sont pas très rapides non plus. Et comme ton script mélange visiblement les trois tu comprends pourquoi la génération prend une minute D'ailleurs, quel est intérêt d'utiliser un tableau PHP pour générer un tableau HTML ? une chaîne à laquelle tu ajouterais les tags HTML seraient bien plus rapide. Et quelles sont ces "fonctions et sous-fonctions" ? D'après ce que je comprends, tu parcours le même tableau plusieurs fois ? Tu devrais être en mesure d'appliquer ces fonctions dans la première et seule boucle. (sans compter la boucle qui récupère les données d'Oracle)

  19. #59
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Le tableau retourné par la fonction oracle est de ce type :
    Voici un exemple, avec les 2 1eres clés, qui correspondent aux 2 1ers champs selectionnés dans ma requete ...

    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
    31
    32
     
    tabResult:
    Array
    (
        [NUMPAGE] => Array
            (
                [0] => 1007
                [1] => 1007
                [2] => 1007
                [3] => 1007
                [4] => 1007
                [5] => 1007
                [6] => 5067
                [7] => 5067
                [8] => 5067
                [9] => 5067
            )
     
        [TYPE] => Array
            (
                [0] => fldtyp_CHK
                [1] => fldtyp_DBL
                [2] => fldtyp_DTM
                [3] => fldtyp_INT
                [4] => fldtyp_OPT
                [5] => fldtyp_TXT
                [6] => fldtyp_DBL
                [7] => fldtyp_DTM
                [8] => fldtyp_NOT
                [9] => fldtyp_OPT
     
    )
    Pour la 1ere clé, on a la valeur 1007 qui se repete 6 fois ... et bien cela devra me donner une cellule avec un rowspan de 6.
    Ensuite, on passe a une autre colonne (TYPE), et on regarde le nombre de repetition de la valeur en cours (tabResult[$ligne][$col]) , pour l'interval precedent (6) .


    Pour la chaine Html, je pense pas que ca soit possible ... d'une part parce que ca change trop de choses, et puis l'avantage d'un tabeau et que je peux travailler dessus comme je veux avec mes templates ...

    J'ai une petite idée pour optimiser, je testerai ca demain ...

    En tout cas merci pour vos reponses !

  20. #60
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Bon, en faisant un unset du tableau SQL pour la ligne et colonne en cours une fois lavaleur lue ... je gagne env 15 s ...

    Donc j'en suis a 55s au lieu de env 70 ...

    C'est encore beaucoup trop, mais c deja un peu mieux ...

    Ca donne :

    - Tous les traitement sans ecriture dans le tableau PHP=> 7s
    - Avec ecriture : 54s

    Je pense effectivement qu'il faudrait zapper l'etape de l'ecriture dans le tableau PHP pour le HTML, et afficher directement !

    C ce que tu fais toi Mr N ? et tu en es a 9s ??

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Requete SQL dans boucle while
    Par vince_grenoblois dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 04/08/2006, 20h41
  2. [T-SQL]pb boucle while
    Par agougeon dans le forum Sybase
    Réponses: 1
    Dernier message: 24/07/2006, 12h05
  3. Optimisation sql
    Par cosmos38240 dans le forum Oracle
    Réponses: 4
    Dernier message: 09/05/2006, 14h04
  4. Optimisation SQL et ComboBox
    Par Cdx dans le forum Bases de données
    Réponses: 6
    Dernier message: 30/12/2005, 14h04
  5. [Debutant] Optimisation d'une boucle
    Par Javatator dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2004, 18h50

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