2011-07-19 7 views
-1

J'écris un script pour migrer ma table d'utilisateurs. Donc, fondamentalement, j'ai 3 tables db: événements, utilisateurs, nouveaux utilisateurs. La table users est destinée à être remplacée par la table newusers et sera supprimée plus tard. La table newusers a une colonne avec la valeur oldusers id (PK).Performances de requête SQL

La table events2 a 2 FK: 1 pour les utilisateurs, 1 pour les nouveaux utilisateurs. J'ai déjà écrit la partie qui migre les utilisateurs d'enregistrements vers de nouveaux utilisateurs, où j'ai du mal à mettre à jour le FK dans la table des événements 2.

J'ai écrit ce qui suit:

update events2 
set newusersid = newuser.id 
from events2 e 
inner join newusers newuser on newuser.olduserid = e.userid; 

mais il prend beaucoup de temps pour exécuter. L'une des raisons de la migration est que nous voulions modifier la valeur de l'ID dans la table newusers afin que je ne puisse pas réutiliser les mêmes valeurs PK pour les enregistrements d'utilisateurs correspondants.

Merci pour votre aide

N.

+1

Vous devrez peut-être ajouter un index temporaire sur 'olduserid', et le laisser tomber une fois la mise à jour terminée. – Blazes

+0

Qu'est-ce que "très longtemps?" C'est une opération ponctuelle - faut-il être rapide? –

+0

@marc_s J'utilise postgresql 8.4 – Nikko

Répondre

2

Avez-vous un index sur la table newuser avec le olduserid et le userId dans cet ordre? Cela devrait accélérer la requête un peu. En outre, si vous mettez à jour des millions de lignes dans la table des événements, vous atteindrez une limite en ce qui concerne la vitesse d'exécution de la requête.

+0

Et avez-vous un index sur 'newuser.olduserid'? –

0
  1. Assurez-vous que vous avez un INDEX sur events2.userid et newusers.olduserid
  2. Vous pouvez essayer d'utiliser une requête SELECT INTO, pas certain que l'impact sur les performances

Plus d'informations sont nécessaires sur la base de données , tables et matériel.

+0

Merci pour les conseils, pardonnez mon ignorance, je dois mettre à jour les enregistrements existants dans les événements2 Je ne sais pas comment utiliser un select dans ce cas. – Nikko

+0

J'aurais dû être plus clair. Je suppose que vous avez créé 'events2' avec un SELECT INTO, ou un INSERT INTO. Au lieu de faire cela et ensuite la mise à jour, je disais faire la mise à jour au moment de la création de 'events2'. – vol7ron

1

Votre requête semble incorrecte. Ne devrait-il pas être le suivant?

update events2 
set newusersid = newuser.id 
from newusers newuser 
where newuser.olduserid = events2.userid; 
+0

Vous avez raison, merci! – Nikko