2017-09-08 2 views
0

Nous avons 3 million de disques dans notre base de données. Nous devons mettre à jour la colonne postalcode avec la même colonne de code postal en supprimant la première lettre 0.DB2 mise à jour en vrac prendre longtemps

identifyno, addresstypecode est colonne primaire composite dans la table d'adresses.

Nous avons utilisé ci-après demande de recherche 300 fois (300 * 10000 = 3000000)

UPDATE db2inst1.address SET postalcode = substr (postalcode, 2) où (identifyno, addresstypecode) IN (SELECT identifyno, à partir de addresstypecode db2inst1. adresse WHERE countrycode = 'IN' et SUBSTR (code postal, 1,1) = '0' FETCH FIRST 10000 lignes seulement); commit;

L'exécution prend du temps (presque 1 jour).

S'il vous plaît aidez-moi à améliorer les performances de la requête.

+0

Avez-vous pensé à sélectionner les données correctes/corrigées dans une nouvelle table et après cela déposez l'ancienne table et remaniez la nouvelle? – MichaelTiefenbacher

Répondre

1

Je pense que le problème est que votre requête touche deux fois la même table. Vous pouvez simplifier à:

UPDATE db2inst1.address 
SET postalcode = SUBSTR(postalcode,2) 
WHERE countrycode='IN' AND SUBSTR(postalcode,1,1)='0' 

Je ne comprends pas pourquoi vous mettez à jour uniquement les 1000 premiers enregistrements, d'autant plus que vous ne disposez pas d'une clause ORDER BY, de sorte que l'ordre est attribué arbitrairement par le moteur de base de données.

+0

avez-vous déjà entendu parler de commit? C'est pour garder la taille de la transaction à une limite acceptable sinon vous auriez des problèmes de journalisation (log complète etc.) – MichaelTiefenbacher

+0

J'ai testé avec environ 50000 enregistrements qui satisfont la condition (countrycode = 'IN' et SUBSTR (code postal, 1,1) = '0'). Cela a pris 3 secondes. Bonne amélioration. – user1346346

+0

Le problème est presque certainement qu'ils frappent la même table deux fois: ils n'obtiennent probablement pas un bon coup d'index pour leur requête. –