Jump to content

Lenteur Suppression produits


pppplus
 Share

Recommended Posts

Je suis en train de supprimer des produits de ma boutique, et c'est d'une lenteur abominable !
J'ai 7000 produits environ, et en supprimer 1 prend des plombes.

PS 1.7.6.1

Je viens de regarder ce qui ralentit :
Quand on supprime un article, tous les articles de la catégories sont impactés (reclassés) OK, normal, pas de problème.
Ensuite, tous les produits sont mis à jour 1 par 1, juste pour date_upd, dans la fonction cleanPositions (du fichier /classes/Product) :

    /**
     * Reorder product position in category $id_category.
     * Call it after deleting a product from a category.
     *
     * @param int $id_category
     */
    public static function cleanPositions($id_category, $position = 0)
    {
        $return = true;

        if (!(int) $position) {
            $result = Db::getInstance()->executeS('
                SELECT `id_product`
                FROM `' . _DB_PREFIX_ . 'category_product`
                WHERE `id_category` = ' . (int) $id_category . '
                ORDER BY `position`
            ');
            $total = count($result);

            for ($i = 0; $i < $total; ++$i) {
                $return &= Db::getInstance()->update(
                    'category_product',
                    array('position' => $i),
                    '`id_category` = ' . (int) $id_category . ' AND `id_product` = ' . (int) $result[$i]['id_product']
                );
                /*$return &= Db::getInstance()->execute(
                    'UPDATE `' . _DB_PREFIX_ . 'product` p' . Shop::addSqlAssociation('product', 'p') . '
                    SET p.`date_upd` = "' . date('Y-m-d H:i:s') . '", product_shop.`date_upd` = "' . date('Y-m-d H:i:s') . '"
                    WHERE p.`id_product` = ' . (int) $result[$i]['id_product']
                );*/
            }
        } else {
            $result = Db::getInstance()->executeS('
                SELECT `id_product`
                FROM `' . _DB_PREFIX_ . 'category_product`
                WHERE `id_category` = ' . (int) $id_category . ' AND `position` > ' . (int) $position . '
                ORDER BY `position`
            ');
            $total = count($result);
            $return &= Db::getInstance()->update(
                'category_product',
                array('position' => array('type' => 'sql', 'value' => '`position`-1')),
                '`id_category` = ' . (int) $id_category . ' AND `position` > ' . (int) $position
            );

            /*for ($i = 0; $i < $total; ++$i) {
                $return &= Db::getInstance()->execute(
                    'UPDATE `' . _DB_PREFIX_ . 'product` p' . Shop::addSqlAssociation('product', 'p') . '
                    SET p.`date_upd` = "' . date('Y-m-d H:i:s') . '", product_shop.`date_upd` = "' . date('Y-m-d H:i:s') . '"
                    WHERE p.`id_product` = ' . (int) $result[$i]['id_product']
                );
            }*/
        }

        return $return;
    }

 

C'est totalement insensé !!
En gros, pour une suppression d'un produit, qui est dans 4 catégories différentes, on va :
- mettre à jour 1 champ de 2 tables pour chaque produit de 4 catégories différentes.
Si j'ai 1000 produits par catégories, on va faire 4000 requêtes !!!

J'ai commenté ces lignes (à 2 endroits dans la fonction, et maintenant, il faut à peu près 1 seconde pour supprimer 1 produit.
Contre plusieurs minutes par produit précédemment.

 

Alors, est-ce que cette mise à jour de date est vraiment pertinente (le produit en lui-même n'est pas modifié en plus !!) et si c'est vraiment pertinent, il faut impérativement modifier la requête, pour qu'elle mette à jour tous les produits en 1 fois.

Moi, je suis pour la supprimer totalement, je ne vois pas l'intérêt de modifier la date de mise à jour d'un produit, qui n'a que changé de position !!

Difficile d'envoyer ça comme un bug... quoique !

Share this post


Link to post
Share on other sites

Bonjour,

ce qui est surtout insensé est de faire une requête de mise à jour par produit. On pourrait très bien remplir un tableau avec les ids des produits à mettre à jour et ensuite executer une seule requête pour mettre à jour la date avec une condition

WHERE p.id_product in ('.implode(',', $ids).')

 

Share this post


Link to post
Share on other sites

Oui @David-Julian Buch c'est à minima ce qu'il faut faire.

@Eolia : dommage, je n'ai pas trouvé votre suggestion, du coup, j'ai passé un peu de temps à trouver cette satanée requête !
J'ai commenté votre post ! Ca fera peut-être avancer le schmilblick !

Share this post


Link to post
Share on other sites

  • 1 year later...

Bonjour à tous,

Je me permets "réouvrir" ce topic, je suis sous un PS 1.7.6.7 et subit ce problème de lenteur lorsque je souhaite supprimer plusieurs produits...  (+/- 1 min / produits).

Existe t-il a ce jour une solution ?

Merci

Share this post


Link to post
Share on other sites

Merci pour votre réponse.

Donc l'idée serait remplacer ces 2 conditions :
 

 WHERE p.`id_product` = ' . (int) $result[$i]['id_product']

par

WHERE p.id_product in ('.implode(',', $ids).')

C'est bien ça ?

Share this post


Link to post
Share on other sites

Non, ça c'est la solution idéale, mais ça demande plus de modifications du fonctionnement global de suppression produits.

La solution, est dans le tout premier post (désactivation de la boucle de reclassement for en fin de fonction)
J'ai mis le code intégral, il n'a pas changé (ou très peu) dans la 1.7

Je l'utilise toujours quand je dois supprimer beaucoup de produits.

 

 

Edited by pppplus (see edit history)

Share this post


Link to post
Share on other sites

D'accord, donc en gros je commente la dernière boucle de la function cleanPositions de product.php c'est bien ça ? Et je la "réactive" dès la suppression massive de mes produits effectués ?

 

Merci encore

Share this post


Link to post
Share on other sites

  • 11 months later...

Bonjour, on a le même soucis via le webservice. du coup quand vous dite "Je l'utilise toujours quand je dois supprimer beaucoup de produits." cela veut dire qu'il faut retirer cette modification lorsqu'on ne doit pas supprimer de produits ? 

 

 

Share this post


Link to post
Share on other sites

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
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More