Como lidar com grandes tabelas sales_flat_quote - remover o lixo abandonado do carrinho

13

Situação

Em nosso banco de dados magento, temos três tabelas que estão crescendo muito.

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

São mais de 6 GB de dados.

Encontrei este artigo sobre como truncar essas tabelas . Este artigo fala apenas da terceira tabela.

Não tenho certeza sobre o truncamento e prefiro excluir todos os dados com mais de 60 dias. O artigo fala de 17 milhões de registros - temos 20! Se estiver correto, excluir esses registros não bloqueará a tabela e, atualmente, estou testando isso em uma instalação de teste. Isso parece funcionar e não conflita muito com o site.

Questões

  • Gostaria de saber se também posso usar a mesma consulta para as outras duas tabelas?
  • Estou me perguntando para que servem essas tabelas.
SPRBRN
fonte

Respostas:

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

sales_flat_quote e suas tabelas relacionadas usam relações de chave estrangeira para excluir em cascata; portanto, as exclusões na tabela principal excluem automaticamente todas as entradas relacionadas nas outras tabelas.

Depois de reduzi-lo em tamanho, você pode modificar facilmente o observador (obrigatório fazer um módulo aqui) que deve limpar as cotações expiradas para incluir todas as cotações, como é feito no primeiro link com retenção personalizada para recuperação abandonada do carrinho e retenção de registros registrados nas cotações dos clientes por um período razoável para que seus clientes não fiquem bravos quando o carrinho se esvazia inesperadamente: Os registros de cotação não convertidos são removidos no Magento?

ou use o AOE Quote Cleaner de Fabrizio Branca

As tabelas sales_flat_quote * contêm o conteúdo do carrinho de compras. Isso é conhecido como cotação e é mantido até o cliente decidir terminar o pedido. Para cotações concluídas que foram convertidas em ordem do cliente, o Magento as limpa automaticamente com uma tarefa cron. A lógica nunca foi estendida para incluir aspas abertas.

Fiasco Labs
fonte
Vejo que o tamanho da outra tabela diminui, então a cascata funciona. Vou testar o módulo AOE. Essa é uma boa dica!
SPRBRN 23/09
1
Eu executei esse script várias vezes, limit 1000000até que todos os registros com mais de 60 dias se esgotassem. Em seguida, instalei o módulo AOE Quote Cleaner. Não usei o módulo AOE para as exclusões de 20m, pois o site parou de funcionar - pelo menos na máquina de teste. O script não apresentou nenhum problema.
SPRBRN 23/09
1
Seja bem-vindo! Eu tive que resolver o problema antes que o módulo de Fabrizio estivesse disponível e assim segui a rota do observador depois de fazer algo semelhante à sua limpeza. Foram precisos cerca de 20 passes para limpar a lama. Agora que está em limpeza programada, não se preocupe!
Fiasco Labs
Quero excluir alguns registros cujo cliente não existe.
Lovely Setia
1

No Magento2, o 'sales_flat_quote' foi substituído por 'quote'; portanto, o comando SQL a seguir pode corrigir esse problema no Magento2:

update quote set items_count = NULL
Agilox
fonte
1
Tipo de, misturando com a resposta de @ fiasco:DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
nicolallias
0

Embora a solução do Fiasco Labs funcione, eu começaria com uma extensão desde o início e usaria Mage_Sales_Model_Quote_Resource_Collectionpara filtrar e remover citações mais antigas da escolha. Usando os métodos adequados, você pode garantir que sua operação funcione em qualquer instalação do Magento, não contando com restrições de banco de dados ou consultas brutas.

Algo como (não testado)…

$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
}

Você pode estender isso Mage_Logou fazer sua própria extensão independente. Bem simples.

musicliftsme
fonte
Por que eu gostaria de criar meu próprio módulo quando o AOE tem um módulo operacional pronto para download?
SPRBRN
1
As extensões AOE são ótimas, então não estou desacreditando essas. Mas, para lhe dar razões. 1.Evite usar consultas manuais em extensões. 2.Tente tornar suas extensões independentes, se possível. DELETEconsultas como essas dependem da restrição do banco de dados, que pode ser alterada no futuro. 3.Use os métodos de fábrica do Magento adequadamente.
musicliftsme 23/09/14
Parece que foi feito um tempo @musicliftsme atrás .. geralmente eles são muito bons
Erfan
0
DELETE FROM sales_flat_quote WHERE entity_id NOT IN (SELECT quote_id FROM sales_flat_order);

Esta consulta excluirá todas as cotações que não foram convertidas em pedidos.

Styopchik
fonte