Comment gérer les énormes tables sales_flat_quote - Supprimer les ordures abandonnées


13

Situation

Dans notre base de données magento, nous avons trois tables qui deviennent trop grandes.

  1. sales_flat_quote_shipping_rate: 3045MB
  2. sales_flat_quote_address: 1688MB
  3. sales_flat_quote: 1897MB

Cela représente plus de 6 Go de données.

J'ai trouvé cet article sur la façon de tronquer ces tables . Cet article ne parle que du troisième tableau.

Je ne suis pas sûr de la troncature et je préfère supprimer toutes les données de plus de 60 jours. L'article parle de 17 millions d'enregistrements - nous en avons 20! Si je ne me trompe pas, la suppression de ces enregistrements ne verrouillera pas la table, et je teste actuellement cela sur une installation de test. Cela semble fonctionner et cela n'entre pas trop en conflit avec le site.

Des questions

  • Je voudrais savoir si je peux également utiliser la même requête pour les deux autres tables?
  • Je me demande à quoi servent ces tableaux.

Réponses:


22
DELETE FROM sales_flat_quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)

sales_flat_quote et ses tables associées utilisent des relations de clé étrangère pour supprimer sur la cascade afin que les suppressions dans la table principale suppriment automatiquement toutes les entrées liées dans les autres tables.

Une fois la taille réduite, vous pouvez facilement modifier l'observateur (obligatoirement faire un module ici) qui est censé nettoyer les devis expirés pour inclure toutes les citations comme cela est fait dans le premier lien avec une rétention personnalisée pour la récupération du panier abandonné et la rétention des journaux enregistrés dans les devis des clients pendant une période raisonnable afin que vos clients ne se fâchent pas lorsque leur panier se vide de façon inattendue: les enregistrements de devis non convertis sont - ils supprimés dans Magento?

ou utilisez le nettoyant pour devis AOE de Fabrizio Branca

Les tableaux sales_flat_quote * contiennent le contenu du panier. Ceci est connu comme un devis et est conservé jusqu'à ce que le client décide de terminer la commande. Pour les devis finis qui ont été convertis en commande client, Magento les efface automatiquement avec une tâche cron. La logique n'a jamais été étendue pour inclure des guillemets ouverts.


Je vois que la taille de l'autre table diminue, donc la cascade fonctionne. Je vais tester le module AOE. Voilà une bonne astuce!
SPRBRN

1
J'ai exécuté ce script plusieurs fois, limit 1000000jusqu'à ce que tous les enregistrements de plus de 60 jours aient disparu. J'ai ensuite installé le module AOE Quote Cleaner. Je n'ai pas utilisé le module AOE pour les suppressions de 20 m, car le site Web a cessé de fonctionner - au moins sur la machine de test. Le script n'a posé aucun problème.
SPRBRN

1
Vous êtes les bienvenus! J'ai dû résoudre le problème bien avant que le module de Fabrizio ne soit disponible et il en est de même pour l'itinéraire d'observation après avoir fait quelque chose de similaire à votre nettoyage. Il a fallu environ 20 passes pour effacer le cran. Maintenant que le nettoyage est prévu, pas de soucis!
Fiasco Labs

Je souhaite supprimer certains enregistrements dont le client n'existe pas.
Lovely Setia

1

Dans Magento2, le 'sales_flat_quote' a été remplacé par 'quote', donc la commande SQL suivante peut résoudre ce problème pour Magento2:

update quote set items_count = NULL

1
En DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
quelque

0

Bien que la solution de Fiasco Labs fonctionne, je voudrais juste commencer par une extension dès le départ et utiliser Mage_Sales_Model_Quote_Resource_Collectionpour filtrer et supprimer les anciennes citations de choix. En utilisant les méthodes appropriées, vous pouvez vous assurer que votre opération fonctionnera sur n'importe quelle installation Magento en ne s'appuyant pas sur les contraintes de base de données ou les requêtes brutes.

Quelque chose comme (non testé)…

$collection = Mage::getModel('sales/quote')->getCollection() 
    -->addFieldToSelect('entity_id') // this is important
    -->addFieldToFilter('created_at', array('lt' => 'some_date'));

foreach ($collection as $quote) {
    $quote->delete(); // safely delete selected quote
}

Vous pouvez l'étendre Mage_Logou créer sa propre extension autonome. Assez simple.


Pourquoi voudrais-je créer mon propre module alors qu'AOE a un module fonctionnel prêt à être téléchargé?
2014

1
Les extensions AOE sont excellentes, donc je ne les discrédite pas du tout. Mais pour vous donner des raisons. 1.Évitez d'utiliser des requêtes manuelles dans les extensions. 2.Essayez de rendre vos extensions indépendantes, si possible. DELETEdes requêtes comme celles-ci dépendent de la contrainte de base de données, qui peut être modifiée à l'avenir. 3.Utilisez les méthodes d'usine de Magento de manière appropriée.
musicliftsme

On dirait que celui-ci a été fait il y a un certain temps @musicliftsme .. généralement ils sont assez bons
Erfan

0
DELETE FROM sales_flat_quote WHERE entity_id NOT IN (SELECT quote_id FROM sales_flat_order);

Cette requête supprimera toutes les citations qui n'ont pas été converties en commandes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.