Jump to content

Lenteur Suppression produits


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 !

Link to comment
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

Link to comment
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 ?

Link to comment
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)
Link to comment
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

Link to comment
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 ? 

 

 

Link to comment
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
×
×
  • Create New...