Otimizar consulta SQL gerada no assistente de atualização de banco de dados

Este artigo aborda a questão de adicionar um campo inteiro a um esquema existente no Adobe Campaign, especialmente quando já existem registros. Para resolver isso, otimize o query SQL condensando os quatro comandos (como discutido neste artigo) em um. Isso deve garantir uma operação eficiente sem problemas de desempenho ou bloqueios.

Descrição description

Ambiente

  • Adobe Campaign
  • Adobe Campaign Classic

Problema/Sintomas

Na maioria das builds do Adobe Campaign, incluindo as do Gold Standard 9032, você pode encontrar vários problemas ao adicionar novas colunas a um esquema existente.

O escopo deste artigo é abordar um problema específico relacionado a:

  • Adição de um campo inteiro a um esquema existente quando os registros já existem.
  • Otimize a query SQL gerada pelo aplicativo para uma eficiente para SQL Postgres.

Resolução resolution

Ao adicionar uma coluna inteira, você obtém a instrução SQL gerada semelhante a esta:

ALTER TABLE NmsRecipient ADD <column_name> SMALLINT;
UPDATE NmsRecipient SET <column_name> = 0;
ALTER TABLE NmsRecipient ALTER COLUMN <column_name> SET Default 0;
ALTER TABLE NmsRecipient ALTER COLUMN i<column_name> SET NOT NULL;

O problema aqui é que há quatro comandos executados em paralelo no banco de dados, o que pode causar problemas de desempenho ou um deadlock.
A solução é condensar esses quatro comandos em um e ainda fazer as mesmas alterações conforme abaixo:

ALTER TABLE NmsRecipient ADD iFichierLiveDataCliqueurs SMALLINT NOT NULL SET Default 0 ;

Ele faz todas as alterações necessárias, adicionando a coluna, definindo o padrão, definido NOT NULL, e também definindo o valor dos registros existentes como 0 devido à restrição NOT NULL.

OBSERVAÇÃO:

Se houver várias colunas inteiras que precisam ser adicionadas, adicione-as uma por uma e execute o assistente de banco de dados para cada alteração.

Isso é para garantir uma operação suave, pois a instrução também atualiza todos os registros existentes para 0, o que pode levar algum tempo, dependendo do número de registros.

Causa

Isso pode acontecer quando você, por exemplo, tem uma tabela de recipient existente ou qualquer outra tabela que já tem mais de um milhão de registros.

Agora, é necessário adicionar uma coluna extra a essa tabela, que é do tipo de dados Integer. Nesse caso, você adiciona essa coluna na definição do schema e deseja confirmar as alterações no banco de dados.

Ao atualizar o banco de dados, o banco de dados encontra um deadlock ou o query bloqueia outras operações.

Isso se deve principalmente à atualização de todos os registros para 0 com base no comando SQL gerado pelo assistente de banco de dados.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f