Ottimizza query SQL generata nella procedura guidata di aggiornamento del database
Questo articolo affronta il problema dell’aggiunta di un campo intero a uno schema esistente in Adobe Campaign, in particolare quando i record esistono già. Per risolvere questo problema, ottimizzare la query SQL condensando i quattro comandi (come descritto in questo articolo) in uno. Ciò dovrebbe garantire un funzionamento efficiente senza problemi di prestazioni o deadlock.
Descrizione description
Ambiente
- Adobe Campaign
- Adobe Campaign Classic
Problema/Sintomi
Nella maggior parte delle build di Adobe Campaign, comprese quelle Gold Standard 9032, si potrebbero riscontrare più problemi quando si aggiungono nuove colonne a uno schema esistente.
L'obiettivo di questo articolo è affrontare un problema specifico relativo a:
- Aggiunta di un campo intero a uno schema esistente quando i record esistono già.
- Ottimizzare la query SQL generata dall'applicazione in una query efficiente per Postgres SQL.
Risoluzione resolution
Quando si aggiunge una colonna di numeri interi, viene generata un'istruzione SQL simile alla seguente:
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;
Il problema qui è che ci sono quattro comandi eseguiti nel database in parallelo, che può causare problemi di prestazioni o un deadlock.
La soluzione consiste nel condensare questi quattro comandi in un unico comando e apportare le stesse modifiche riportate di seguito:
ALTER TABLE NmsRecipient ADD iFichierLiveDataCliqueurs SMALLINT NOT NULL SET Default 0 ;
Vengono apportate tutte le modifiche necessarie, aggiungendo la colonna, impostando il valore predefinito, impostando NOT NULL e impostando il valore dei record esistenti su 0 a causa del vincolo NOT NULL.
NOTA:
Se è necessario aggiungere più colonne intere, aggiungerle una alla volta ed eseguire la procedura guidata del database per ogni modifica.
In questo modo, il funzionamento non subirà interruzioni poiché l'istruzione aggiorna anche tutti i record esistenti in 0, operazione che può richiedere tempo a seconda del numero di record.
Causa
Ciò può verificarsi, ad esempio, se disponi di una tabella dei destinatari esistente o di qualsiasi altra tabella con oltre un milione di record.
Se ora devi aggiungere una colonna aggiuntiva alla tabella, che è del tipo di dati "Intero". In tal caso, aggiungi tale colonna nella definizione dello schema e desideri eseguire il commit delle modifiche nel database.
Durante l’aggiornamento del database, si verifica un deadlock o la query blocca altre operazioni.
Ciò è dovuto principalmente all'aggiornamento di tutti i record in 0 in base al comando SQL generato dalla procedura guidata del database.