2012-03-28 8 views
0

J'ai une table avec 10 millions d'enregistrements sans index et j'essaye de dédupliquer la table. J'ai essayé les inserts avec select où soit en utilisant une jointure gauche ou là où n'existe pas; mais chaque fois que je reçois l'erreur avec violation de la clé. L'autre problème est que le fichier journal devient trop volumineux et la transaction ne se termine pas. J'ai essayé de régler la récupération à simple comme recommandé en ligne, mais cela n'aide pas. Voici les requêtes que j'ai utilisées;le fichier journal de SQL grandit trop grand

insert into temp(profile,feed,photo,dateadded) 
select distinct profile,feed,photo,dateadded from original as s 
    where not exists(select 1 from temp as t where t.profile=s.profile) 

Ceci produit simplement la violation d'erreur de clé. J'ai essayé d'utiliser ce qui suit:

insert into temp(profile,feed,photo,dateadded) 
select distinct profile,feed,photo,dateadded from original as s 
left outer join temp t on t.profile=s.profile where t.profile is null 

Dans les deux cas maintenant le fichier journal se remplit avant la fin de la transaction. Donc, ma question principale est sur le fichier journal et je peux comprendre la déduplication avec les requêtes.

Répondre

2

Vous devrez peut-être travailler par lots. Ecrire une boucle pour passer par 5000 (vous pouvez expérimenter avec le nombre, j'ai dû aller aussi loin que 500 ou jusqu'à 50 000 en fonction de la DB et comment il était occupé) dossiers ou à la fois.

Quelle est votre clé? Il est probable que votre requête doive utiliser une fonction aggreagate sur dataadded (utilisez la fonction min ou max).

+0

Je vais essayer cette – vbNewbie

+0

on m'a dit que quelle que soit l'utilisation de lots que je dois avoir un index non cluster sur la table source que je fais pas parce qu'il contient des dupes. ou comment cela peut-il être fait alors? – vbNewbie

+0

les index ne doivent pas être des index uniques – HLGEM

1

Plus la transaction est importante, plus le journal des transactions sera volumineux. Le journal est utilisé pour la récupération non validée d'une transaction ouverte, donc si vous ne commettez pas fréquemment et que vous exécutez une transaction très importante, le fichier journal va augmenter considérablement. Une fois validée, le fichier deviendra un espace libre. C'est pour protéger les données au cas où quelque chose échouerait et que l'annulation serait nécessaire.

ma suggestion serait d'exécuter l'insertion par lots, commis après chaque lot

+0

merci pour votre réponse.Vous avez une idée pourquoi je reçois toujours la violation de l'erreur clé unique – vbNewbie

+0

voir ici: http://stackoverflow.com/questions/6483699/unique-key-key-violation-in-sql-server -is-it-safe-to-suppose-erreur-2627 –