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 :

Temps de traitement requete [SQL-Server]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Transports

    Informations forums :
    Inscription : janvier 2013
    Messages : 29
    Points : 12
    Points
    12
    Par défaut Temps de traitement requete
    Bonjour,

    J'ai commencé à développer une appli web en PHP qui va chercher des données dans une bdd MSSQL d'un logiciel métier afin d'afficher une sorte de planning.

    J'avais (pour des raisons de débutisme aigu) commencer à développer en partant sur le principe que je dressais en X la liste des employés en Y la liste des jours de la semaine et que au croisement des 2 dans chaque cellule j'allais chercher les infos de tâches du planning dans la BDD.

    Bien évidemment, un membre d'ici (merci darkstar) m'a alerté sur le fait que balancer pour certaines agences 17 fois 7 jours (donc 119 fois la requête) n'était pas intelligent mais qu'il valait mieux aller chercher toutes les tâches de tous les employés de toute la semaine d'un coup et de trier par case en PHP après !

    Me suis dit : il a raison vu que la page met 5 sec à se lancer c'est forcément à cause de ça.

    Du coup j'ai tant bien que mal réussi à regrouper tous mes appels à la bdd MSSQL en un seul et là, ô miracle, ça .... fait pareil... 5.70s dans chrome pour afficher la page dont 2.80s de Waiting(TTFB) et 2.89s de content download.

    Alors voici la fonction PHP en question avec la requête MSSQL :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    function bddtoarray($agence,$activite,$lundi,$dimanche) {
        require('config.php');
        setlocale(LC_TIME, 'fr','fr_FR','fr_FR@euro','fr_FR.utf8','fr-FR','fra');
        date_default_timezone_set('Europe/Paris');
        $lundi = $lundi->format('Y-d-m');
        $dimanche = $dimanche->format('Y-d-m');
     
        $query = "SELECT
                    TA.idTaches AS Taches,
                    TA.idTypeTache AS TypeT,
                    TA.DateDebut AS Debut,
                    TA.DateFin AS Fin,
                    TA.Rouge AS R,
                    TA.Vert AS G,
                    TA.Bleu AS B,
                    TA.LibelleClient AS Client,
                    TA.AdresseChantier AS Chantier,
                    TA.Observation AS Note,
                    TA.NumFacture AS Fact,
                    PE.Nom AS Nom,
                    PE.Prenom AS Prenom,
                    PE.idPersonne as UserId,
                    PE.Ordre as Ordre
                FROM  bdd.Taches TA
                INNER JOIN bdd.PersonneFacturation PF
                    ON PF.idTaches=TA.idTaches
                INNER JOIN bdd.Personne PE
                    ON PF.idPersonnel = PE.idPersonne
                WHERE   PE.idAgence = '$agence'
                    AND PE.idTypeActivite = '$activite'
                    AND PE.DateSortie IS NULL 
                    AND PE.Indisponible = '1'
                    AND (('$lundi 08:30:00' BETWEEN TA.DateDebut AND TA.DateFin AND NOT TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59') OR TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59')
                ORDER BY Ordre,Debut ASC
                ";
        $result = sqlsrv_query($conn,$query, array(), array( "Scrollable" => 'static' ));
        while( $row = sqlsrv_fetch_array( $result) ) {
            $Taches[] = $row["Taches"];
            $TypeT[] = $row["TypeT"];
            $Debut[] = $row["Debut"];
            $Fin[] = $row["Fin"];
            $Red[] = $row["R"];
            $Green[] = $row["G"];
            $Blue[] = $row["B"];
            $Client[] = $row["Client"];
            $Chantier[] = $row["Chantier"];
            $Note[] = $row["Note"];
            $Fact[] = $row["Fact"];
            $Nom[] = $row["Nom"];
            $Prenom[] = $row["Prenom"];
            $UserId[] = $row["UserId"];
            $Ordre[] = $row["Ordre"];
        }
     
    	sqlsrv_free_stmt($result);
     
        if(!isset($Taches)) { $ListeTaches = NULL; }
        else {
            global $ListeTaches;
            $ListeTaches = ["Taches"=>$Taches,"TypeT"=>$TypeT,"Debut"=>$Debut,"Fin"=>$Fin, "R"=>$Red, "G"=>$Green, "B"=>$Blue, "Client"=>$Client, "Chantier"=>$Chantier, "Note"=>$Note, "Fact"=>$Fact, "Nom"=>$Nom, "Prenom"=>$Prenom, "UserId"=>$UserId, "Ordre"=>$Ordre];
        }
        return $ListeTaches;
     
    }

    Du coup exactement le même temps à un poil de *** près que si je balance mes 119 requêtes !!!

    Je précise :
    • que ma BDD MSSQL 2008 se trouve sur une machine virtuelle de mon réseau
    • que mon serveur Web est actuellement hébergé via Wamp sur mon poste en gigabit sur le réseau
    • que quand je fais la même requête via DBeaver sur mon poste elle met 73ms à s'exécuter
    • que ma table la plus volumineuse (Taches) fait environ 69000 lignes mais j'imagine que ça n'importe peu vu que via le soft d'admin BDD le temps est correct pour me pondre les données


    Pouvez-vous SVP m'éclairer et me donner une piste ? car là j'avoue ne pas comprendre d'où vient le pb !

    iLtG

  2. #2
    Expert confirmé Avatar de Séb.
    Profil pro
    Inscrit en
    mars 2005
    Messages
    3 748
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2005
    Messages : 3 748
    Points : 5 171
    Points
    5 171
    Par défaut
    que quand je fais la même requête via DBeaver sur mon poste elle met 73ms à s'exécuter
    2.80s de Waiting(TTFB)
    et 2.89s de content download.
    Pour le TTFB, tu peux dans ton script poser des microtime() pour checker si quelque chose en particulier ralentit, et où
    Pour le content download, ça dépend de la bande-passante dispo sur le serveur, le réseau, le client, tes données pèsent combien ?
    Es-tu sûr que c'est juste le SQL cela qui ralentit ta page ? Si tu n'appelles pas bddtoarray() ça donne quoi ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    juin 2008
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juin 2008
    Messages : 2 076
    Points : 3 539
    Points
    3 539
    Billets dans le blog
    8
    Par défaut
    Bonjour.
    Tu peux m'expliquer cette condition ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (('$lundi 08:30:00' BETWEEN TA.DateDebut AND TA.DateFin AND NOT TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59') OR TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59')

    Peut-être que je me trompe, mais j'ai l'impression que tu souhaites comparer une période et savoir si elle recoupe une AUTRE période, en tout ou partie.

    Dans ce cas, il faudrait faire quelque chose dans ce goût.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $debut = new DateTime('2021-01-01 08:30:00');
    $fin = new DateTime('2021-03-01 23:59:59');
    if($debut instanceof DateTime && $fin instanceof DateTime){//aucune date incohérente possible
        $sql='BLABLABLA WHERE "'.$debut->format('Y-m-d H:i:s').'" <=  TA.DateFin AND "'.$fin->format('Y-m-d H:i:s').'" >=  TA.DateDebut;';
    }
    Par ailleurs, tu as bien posé des indexes et des clés étrangères sur les colonnes de tes tables ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Transports

    Informations forums :
    Inscription : janvier 2013
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    Salut à vous,

    Merci à vous des réponses et désolé du temps de réponse mais emploi du temps compliqué.

    Galanterie oblige je répond à Dendrite d'abord :

    Alors explications :

    La BDD ne m'appartient pas elle provient d'un progiciel et donc du coup je l'exploite telle qu'elle est Et j'avoue avoir été obligé de me renseigner de ce qu'était une clé étrangère () mais oui je confirme tout est en ordre de ce côté.

    Alors pour ce qui est de(s) condition(s) : comme je "produit" une sorte de planning avec un affichage en Y les jours de la semaine et en X les employés d'un certain type pour connaître leurs tâches "journalières" et qu'une tâche peut débuter un autre jour que le 1er jour de la semaine et terminer un autre jour que le dernier jour de la semaine affichée j'ai donc posé cette multi condition pour ne récupérer qu'une seule fois la tâche qui "traverse" la journée ou même la semaine. Maintenant s'il y a mieux à faire je suis ouvert mais j'avoue avoir trituré la question plusieurs fois dans mon pauvre petit cerveau pour pondre ceci.

    Pour Séb. :

    Je suis un abruti J'utilise Visual Code Studio et quand tu sélectionnes plusieurs lignes avec plusieurs langages différents ils ne te commente pas tout correctement .... Du coup j'ai commenté une div avec du PHP dedans qui appelait les ANCIENNES fonction qui au final étaient quand même lancées .... Merci donc pour les microtime() car c'est grâce à ça que je me suis aperçu qu'il générait quand même du temps sur le code censé être commenté Je suis maintenant à 79ms de content download qui est à peu près le tps en local.
    Pour le reste (TTFB) Je viens de m'apercevoir qu'il mange bcp de temps en appel sur les fichers CSS et JS bootstrap et jquery donc je vais voir à les héberger pour voir la diff.

    iLtG

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

Discussions similaires

  1. Temps de traitement d'une requete tres long
    Par maskk dans le forum VBA Access
    Réponses: 5
    Dernier message: 21/01/2013, 08h37
  2. [Perf]Utilisation des Logger et temps de traitement ?
    Par elitost dans le forum Logging
    Réponses: 6
    Dernier message: 12/04/2005, 23h13
  3. Stats : connaitre en temps reel les requetes en cours d'exec
    Par jeff37 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/12/2004, 17h01
  4. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08
  5. Estimation de Temps d'un requete, lancement asynchrone
    Par maveric dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/10/2003, 23h13

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