Jump to content

1000 produits + 1000 clients = Requete sur le front de 73sec à cause de "ps_customer_group"


pctony

Recommended Posts

Bonjour,

Je me suis rendu compte d'un ralentissement sur le front du site après un import csv concernant la table des clients.
Je vous fait part de mon fichier d'essai, avez-vous le même problème après l'avoir importé ?
Je suis sous prestashop 1.2

Merci d'avance,
Cordialement.

clients5.csv

Link to comment
Share on other sites

SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`,
           i.`id_image`, il.`legend`, t.`rate`, m.`name` AS manufacturer_name
           FROM `ps_product` p
           LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = 2)
           LEFT JOIN `ps_image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
           LEFT JOIN `ps_image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = 2)
           LEFT JOIN `ps_tax` t ON (t.`id_tax` = p.`id_tax`)
           LEFT JOIN `ps_manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
           LEFT JOIN `ps_category_product` cp ON (cp.`id_product` = p.`id_product`)
           INNER JOIN `ps_category_group` ctg ON (ctg.`id_category` = cp.`id_category`)
           INNER JOIN `ps_customer_group` cg ON (cg.`id_group` = ctg.`id_group`)
           WHERE p.`active` = 1
           AND DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL 20 DAY)) > 0
           AND (cg.`id_customer` = 0 OR ctg.`id_group` = 1)
           GROUP BY p.`id_product`
           ORDER BY p.`date_add` DESC
           LIMIT 0, 5




Temps de la requete : 79.45sec
Si je retire le INNER JOIN sur ps_customer_group, je passe à : 0.0830sec

Le site contient à peu près 1000 produits et 1000 clients.
Cette nouvelle fonctionnalité de groupes me paraît dangereuse et gourmande en ressources pour les gros sites ?

Des avis ?

Link to comment
Share on other sites

1.1 ou 1.2, sans être un spécialiste de la programmation, les ralentissements sur les grosses boutiques : celà ne me surprend pas... déjà en 1.1 les stats génèrent un gros ralentissement dès que le site comment en prendre du volume. (Même sur un serveur dédié).

Je pense que dès qu'une boutique commence à prendre un gros volume, faut penser a l'alléger en désactivant certains modules et fonctions "non indispensables" afin d'optimiser la vitesse d'affichage.

Link to comment
Share on other sites

73 secondes une requête pour amener 5 produits.. mais cela remet juste en cause la notion des groupes frontoffice (du moins son intégration dans les requêtes de la Class Product). Si je retire cela des requêtes, le site est rapide et les tests de charges sont correctes. Je tient à rappeller que je suis sous un presta 1.2 sans aucune modification de code ou de template, juste un import CSV de 1000 produits et 1000 clients.. Ceci est donc la limite (largement dépassé) de presta 1.2 ? :(

Link to comment
Share on other sites

J'ai le même soucis sur une boutique où l'on vient inscrire 6000 clients, tout va bien sans la table ps_customer_group mais une fois renseigné le site ne répond plus du tout.

Je vais tenter de désactiver ce module car sinon les clients ne voit aucun produit.

Link to comment
Share on other sites

Bonjour à tous,

j'ai également le même problème !!

J'ai environ 1780 clients et 1500 produits pour le moment et avec la catégorie défaut tout met des minutes à se charger.

Par contre je ne sais pas dans qu'elle page, il faut retirer cette requete INNER JOIN sur ps_customer_group pour annuler cela? je veux bien connaître la page svp.

J'ai l'impression que dès qu'il y a beaucoup de clients dans la catégorie défaut tout se ralentit alors que ce n'est pas le cas si je les transfert dans une autres catégorie ?? N'est ce pas plutôt un problème de programmation quelque part (sans critiques aucune pour la team presta) ???

Du coup, je viens de tester avec un nouveau groupe "clients" qui a l'id 2 donc différent de celui par défaut 1 et j'ai mis à tous mes clients dans la table ps_customer_group l'id_groupe 2. J'ai fais de même pour les catégories pour qu'elle s'affichent dans le groupe défaut et dans le groupe clients.

surprise la lenteur à disparue, seul bémol lorsqu'un client s'inscrit c'est de nouveau défaut dans la table s_customer_group qui se met, je suis donc obligé de mettre à la main le groupe 2.

Config : Serveur dédié chez OVH

Link to comment
Share on other sites

Voici la solution optée :

se rendre dans les fichiers /classes/product.php et /classes/category.php

Modifier la fonction checkAccess pour les deux, en modifiant simplement le "return false" en "return true" qui se situe à la fin de la fonction

Il faut ensuite modifier le module blockcategories en modifiant la fonction hookLeftColumn du fichier blockcategories.php

Mettre ce code à la place de l'existant :

if (!$result = Db::getInstance()->ExecuteS('
       SELECT DISTINCT c.*, cl.*
       FROM `'._DB_PREFIX_.'category` c 
       LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.intval($params['cookie']->id_lang).')
       WHERE 1'
       .(intval($maxdepth) != 0 ? ' AND `level_depth` <= '.intval($maxdepth) : '').'
       AND (c.`active` = 1 OR c.`id_category`= 1)
       ORDER BY `level_depth` ASC, cl.`name` ASC'))
           return;
       $resultParents = array();
       $resultIds = array();



Si tu as le moindre soucis, n'hésite pas

Link to comment
Share on other sites

Merci Thomas pour cette réponse ultra rapide.

Mais c'est avec regret, que je t'annonce que malgré tous les changements ça ne donne rien !

voilà ce que j'ai mis sur classes/Categories.php et classes/Product.php:

public function checkAccess($id_customer)
   {
       if (!$id_customer)
       {
           $result = Db::getInstance()->getRow('
           SELECT ctg.`id_group`
           FROM '._DB_PREFIX_.'category_group ctg
           WHERE ctg.`id_category` = '.intval($this->id).' AND ctg.`id_group` = 1');
       } else {
           $result = Db::getInstance()->getRow('
           SELECT ctg.`id_group`
           FROM '._DB_PREFIX_.'category_group ctg
           INNER JOIN '._DB_PREFIX_.'customer_group cg on (cg.`id_group` = ctg.`id_group` AND cg.`id_customer` = '.intval($id_customer).')
           WHERE ctg.`id_category` = '.intval($this->id));
       }
       if ($result AND isset($result['id_group']) AND $result['id_group'])
           return true;

       return true;
   }



Est ce bien celà ??

et j'ai remplacé le code que tu m'a donné dans blockcategories.php à la ligne 103 juste après :

    $id_customer = intval($params['cookie']->id_customer);
       $maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH');

if (!$result = Db::getInstance()->ExecuteS('
               SELECT DISTINCT c.*, cl.*
               FROM `'._DB_PREFIX_.'category` c 
               LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.intval($params['cookie']->id_lang).')
               WHERE 1'
               .(intval($maxdepth) != 0 ? ' AND `level_depth` <= '.intval($maxdepth) : '').'
               AND (c.`active` = 1 OR c.`id_category`= 1)
               ORDER BY `level_depth` ASC, cl.`name` ASC'))
                   return;
               $resultParents = array();
               $resultIds = array();



En tous les cas j'ai laissé pour le moment comme j'ai dit, avec un second groupe actif et j'ai remplacé la valeur lors de l'inscription dans classes/Customer.php en 2 directement.

Plus de manip à la main, un groupe qui sert à rien mais bon voilà pour le moment ça marche !! Je suis preneur d'une solution propre tout de même.

Link to comment
Share on other sites

1.2.1

mais je me rends compte maintenant que j'ai d'autres soucis comme par exemple :les recherches avec le block recherche rapide !!
En fait lorsque je suis pas connecté je trouve rien et quand je suis identifier je peux faire des recherches.

De plus en plus bizarre. Je fais un état des lieux et je te tiens au courant d'où j'en suis !!

Merci en tous les cas de ton aide.

Link to comment
Share on other sites

Salut Thomas,

Alors voici mes premières conclusions :
Si je fais avec tes modifs de code et pour l'affichage des catégories et des produits soit normal, il faut quand même vider la table ps_customer_group sinon ça rame toujours !! Est ce que toi tu as laissé cette table remplie ?

En revanche je n'ai aucun résultats via au formulaire de recherche rapide (identifié ou non) sûrement car on squeeze id_group dans les pages modifiées précédemment et qu'il faut faire de même quelque part dans classes/search.php ?

Idem avec le block fabricant qui liste les fabricants mais avec 0 produits à chaque fois.

Voilà pour le moment.
A la rigueur contact moi par MP je te donne l'adresse que tu puisse voir de tes propres yeux !!

Link to comment
Share on other sites

Salut, Thomas, je reviens te donner des nouvelles !!

Bilan final pour moi, tout fonctionne, si je met mes clients en ps_customer_group = 2. Ne me demande pas pourquoi, j'en sais rien ! Mais l'essentiel c'est que tout fonctionne et sur tous les navigateurs !! Voilà normalement on passe en prod de la mise à jour début septembre. ( le temps de régler les derniers détails).

Merci pour ton aide et à bientôt pour peut être ton module d'export.

Link to comment
Share on other sites

salut tlandru

tu peux me donner la ligne exacte des return false a changer, il y'en a un packet et je veux pas me tromper.

site fonctionnais très bien et tout d'un coup des lenteur pas possible. pourtant serveur dédié chez 1and1.fr

merci

Link to comment
Share on other sites

se rendre dans les fichiers /classes/product.php et /classes/category.php

La fonction check access est tout en bas de ces fichiers, tu peux pas te tromper (sinon un coup de CTRL+F)

Modifier la fonction checkAccess pour les deux, en modifiant simplement le “return false” en “return true” qui se situe à la fin de la fonction (il y a deux return dans check access à la fin de la fonction, modifier le deuxieme)

Link to comment
Share on other sites

  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...