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:
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
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.
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;

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;