Lista de preços
Dicas para melhorar performance na atualização de uma lista de preços
COLECA.FAQ-93186
Uma atualização de uma lista de preços muito grande e/ou com muitas listas derivadas pode ser um processo que leva muitas horas para ser executado.
Seguem algumas dicas que podem ajudar nestes casos:
- Verificar as preferências COLECA.ITENS_COLECOES.* - Várias delas podem ser desabilitadas durante o processo:
COLECA.ITENS_COLECOES.ATUALIZAR_DATA_PRODUTO = N
COLECA.ITENS_COLECOES.CRITICAR_PRECOS_LISTAS_DEPENDENTES = N
COLECA.ITENS_COLECOES.VERIFICAR_CUSTO_FINANCEIRO = N
COLECA.ITENS_COLECOES.VERIFICAR_CUSTO_FORNECEDOR = N
COLECA.ITENS_COLECOES.VERIFICAR_ULTIMA_COMPRA - N
- Executar o processo em transações menores. A velocidade aumenta exponencialmente com o número de registros alterados. Se atualizar 2000 itens leva 5 minutos, 4000 pode levar mais do que o triplo. Assim, sempre que possível, a sugestão é dividir os itens em "lotes" e executar a atualização de cada lote em transações separadas.
- Podem ser usados comandos de script engine, como:
upd itens_colecoes
set preco_sugerido = preco_sugerido * 1.03
where colecao_id = 6326188
and ativo = 'S'
and (data_fim_comercializacao is null or data_fim_comercializacao > now())
and id >= 10000000;
Executar depois:
and id < 10000000
and id >= 6350000
E assim sucessivamente.
- Pode-se utilizar o SQL abaixo para definir faixas de ID com lotes de itens com uma determinada quantidade de registros
select min(id), max(id), count(1)
from (
SELECT id, (row_number() OVER () - 1) / 5000 AS lote
from (
select id
FROM itens_colecoes
where colecao_id = 6326188
and ativo = 'S'
and (data_fim_comercializacao is null or data_fim_comercializacao > now())
order by id
) q
) q
group by lote
order by 1;
- Tecnicamente, seria possível executar um script da seguinte forma:
Atenção
Isso ainda não foi testado.
Sugere-se testar primeiramente em uma base de testes.
Este script divide automaticamente os itens em lotes de 1000 registros e comita as alterações para cada lote.
Deve-se incluir alguma saída para apresentar os IDs produzidos para que caso de ocorra algum erro seja possível recuperar o que já foi feito e o que ainda falta.
for lote in select min(id) as id1
, max(id) as id2
from (
SELECT id, (row_number() OVER () - 1) / 1000 AS lote
from (
select id
FROM itens_colecoes
where colecao_id = 6326188
and ativo = 'S'
and (data_fim_comercializacao is null or data_fim_comercializacao > now())
order by id
) q
) q
group by lote
order by 1
loop
upd itens_colecoes
set preco_sugerido = preco_sugerido * 1.03
where colecao_id = 6326188
and ativo = 'S'
and (data_fim_comercializacao is null or data_fim_comercializacao > now())
and id between $lote.id1 and $lote.id2;
commit;
end-loop;
- Após a atualização, não esquecer de reconfigurar as preferências aos seus valores anteriores.