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

Laravel PHP Discussion :

fetch query avec data elevés


Sujet :

Laravel PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Apprenti ingenieur administrateur systèmes
    Inscrit en
    octobre 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti ingenieur administrateur systèmes
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2012
    Messages : 67
    Points : 41
    Points
    41
    Par défaut fetch query avec data elevés
    Bonjour, je voudrai savoir s'il y avait une meilleure facon de gérer le fetching de données dans une table , je me retrouve avec 4 $companyIds dont le premier contient plus de 100000 enregistrements le 2eme 5000 etc, et ma requete prend un temps fou..

    Merci a vous

    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
     
    public static function getStockByItemGroup(string $companyName, $grouped, $to = null)
        {
            $data = [];
            $companyIds = $companyName != 'all' ? [$companyName] : array_keys(config('app.company_ids'));
            foreach ($companyIds as $companyId) {
                $result = self::selectRaw("group_id, dates_format(posting_date, '" . $grouped . "') as posting_date, items.unit_cost * sum(quantity) as cost");
                if ($to) {
                    $result = $result->where('posting_date', '<=', $to);
                }
     
                $data[] = $result->where('stocks.company_id', $companyId)
                    ->join('items', 'stocks.item_id', 'items.item_id')
                    ->where('items.company_id', $companyId)
                    ->groupBy('group_id', 'unit_cost', 'posting_date')
                    ->orderBy('posting_date', 'asc')
                    ->get();
     
            }
            return Arr::flatten($data);
        }

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

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 396
    Points : 4 511
    Points
    4 511
    Par défaut
    ~100 000 enregistrements c'est pas grand chose

    Combien de temps prend ta requête ?
    Tes tables sont correctement indexées ?
    Es-tu sûr que c'est bien la requête qui prend du temps et pas autre chose ?
    As-tu essayé de tester la requête directement dans ton client SQL ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre du Club
    Homme Profil pro
    Apprenti ingenieur administrateur systèmes
    Inscrit en
    octobre 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti ingenieur administrateur systèmes
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2012
    Messages : 67
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Séb. Voir le message
    ~100 000 enregistrements c'est pas grand chose

    Combien de temps prend ta requête ?
    Tes tables sont correctement indexées ?
    Es-tu sûr que c'est bien la requête qui prend du temps et pas autre chose ?
    As-tu essayé de tester la requête directement dans ton client SQL ?
    Hello, merci de ta réponse, en soi la requête ne prend pas de temps, les tables sont indexées, je reprends le code de quelqu'un et je pense que cela prend du temps au niveau de php car il y a une imbrication faramineuse de foreach. Voici le code utilisant la requete, le foreach passe pour chaque enregistrement.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     $stockGroupedByGroup = Stock::getStockByItemGroup($company, $grouped, $to);
            foreach ($stockGroupedByGroup as $row) {
                $realGroup = self::stockGroups($row->group_id);
                if (!isset($resultSum[$row->group_id])) {
                    $resultSum[$row->group_id] = 0;
                }
                if (!isset($resultByDays[$realGroup][$row->posting_date])) {
                    $resultByDays[$realGroup][$row->posting_date] = 0;
                }
                $resultSum[$row->group_id] += $row->cost;
                $resultByDays[$realGroup][$row->posting_date] += $row->cost;
     
            }

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

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 396
    Points : 4 511
    Points
    4 511
    Par défaut
    Mesure où ça prend du temps exactement => microtime()
    Essaie de faire tout ce qui est groupement et calculs directement avec SQL
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre du Club
    Homme Profil pro
    Apprenti ingenieur administrateur systèmes
    Inscrit en
    octobre 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti ingenieur administrateur systèmes
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2012
    Messages : 67
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Mesure où ça prend du temps exactement => microtime()
    Essaie de faire tout ce qui est groupement et calculs directement avec SQL
    Merci de ta reponse, il est impossible pour moi de tout passer en SQL car il y a trop de traitement niveau metier je dois le gerer auniveau PHP,
    J'ai installe une librairie pour voir le temps d'execution et j'ai teste en utilisant cursor() au niveau de la requête, je passe de 160mb de memoire a 15mb , mais le temps reste toujours le même apres le foreach : 15s

    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
     $query = self::selectRaw("group_id, date_format(posting_date, '" . $grouped . "') as posting_date, items.unit_cost * sum(quantity) as cost");
            if ($to) {
                    $query = $query->where('posting_date', '<=', $to);
            }
     
            $data  = $query->where('stocks.company_id', 'idai')
                    ->join('items', 'stocks.item_id', 'items.item_id')
                    ->where('items.company_id', 'idai')
                    ->groupBy('group_id', 'unit_cost', 'posting_date')
                    ->orderBy('posting_date', 'asc');
     
            foreach($data->cursor() as $items){
                $realGroup = self::stockGroups($items->group_id);
                if (!isset($resultSum[$items->group_id])) {
                    $resultSum[$items->group_id] = 0;
                }
                if (!isset($resultByDays[$realGroup][$items->posting_date])) {
                    $resultByDays[$realGroup][$items->posting_date] = 0;
                }
                $resultSum[$items->group_id] += $items->cost;
                $resultByDays[$realGroup][$items->posting_date] += $items->cost;
            }
    J'avoue que je commence a etre perdu, j'ai juste besoin de recuperer un JSON a la fin, je ne fais pas d'operations CRUD

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

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

    Informations forums :
    Inscription : juin 2008
    Messages : 2 074
    Points : 3 536
    Points
    3 536
    Billets dans le blog
    8
    Par défaut
    Tu peux essayer en mettant $to en dernier dans tes filtres ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Membre du Club
    Homme Profil pro
    Apprenti ingenieur administrateur systèmes
    Inscrit en
    octobre 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti ingenieur administrateur systèmes
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2012
    Messages : 67
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Tu peux essayer en mettant $to en dernier dans tes filtres ?
    Hello, actuellement je fais :
    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
     
     foreach ($companyIds as $companyId) {
                $result = self::selectRaw("group_id, date_format(posting_date, '" . $grouped . "') as posting_date, items.unit_cost * sum(quantity) as cost")
                ->where('stocks.company_id', $companyId)
                    ->join('items', 'stocks.item_id', 'items.item_id')
                    ->where('items.company_id', $companyId)
                    ->groupBy('group_id', 'unit_cost', 'posting_date')
                    ->orderBy('posting_date', 'asc');
     
                if ($to) {
                     $result->where('posting_date', '<=', $to);
                }
     
                $data[] = $result
                    ->toBase()
                    ->get();
     
            }
            return Arr::flatten($data);
    Je teste le toBase(), et je reduis de moitié le temps d'execution , a voir si je peux améliorer qutre chose

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

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

    Informations forums :
    Inscription : juin 2008
    Messages : 2 074
    Points : 3 536
    Points
    3 536
    Billets dans le blog
    8
    Par défaut
    Tu as compris pourquoi ?

    Quand tu dis "filtre-moi toutes les femmes de france puis celles qui vivent à Trifouilly les oies"
    Tu comprends bien que ça va être plus long que "filtre-moi tous les gens qui vivent à "Trifouilly les oies" puis les femmes parmi eux.

    Donc dans tes "where", prends l'habitude, en SQL comme en DQL de filtrer du plus restreint vers le plus large pour optimiser.
    Dans le même genre, pose-toi la question des items ou des stocks, lequel renvoie le moins de tuples et mets le en premier.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

Discussions similaires

  1. Query avec un CREATE TEMPORARY TABLE = erreur ?
    Par d3mone dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/05/2007, 19h11
  2. [Visual Web] Query avec deux paramètres
    Par eponette dans le forum NetBeans
    Réponses: 1
    Dernier message: 19/03/2007, 13h44
  3. [EJB3] problème de fetch=lazy avec ejb3
    Par pbdlpc dans le forum JPA
    Réponses: 2
    Dernier message: 16/01/2007, 21h52
  4. optimisation query avec BETWEEN
    Par maxtin dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/01/2007, 01h22
  5. Réponses: 4
    Dernier message: 31/01/2006, 17h59

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