6
votes

Comment savoir d'identifier des lignes d'une table sans clé primaire

J'importe plus de 600.000.000 lignes d'une ancienne base de données / table qui n'a aucun jeu de clé primaire, cette table figure dans une base de données SQL Server 2005. J'ai créé un outil pour importer ces données dans une nouvelle base de données avec une structure très différente. Le problème est que je souhaite reprendre le processus d'où il s'est arrêté pour une raison quelconque, comme une erreur d'erreur ou de réseau. Comme cette table n'a pas de clé primaire, je ne peux pas vérifier si la ligne était déjà importée ou non. Est-ce que quelqu'un sait identifier chaque ligne afin que je puisse vérifier si c'était déjà importé ou non? Cette table a une ligne dupliquée, j'ai déjà essayé de calculer le hachage de toutes les colonnes, mais cela ne fonctionne pas en raison de lignes dupliquées ...

Merci!


4 commentaires

Pourquoi ne créez-vous pas un index unique sur la table cible, puis supprimez-le après que toutes les importations soient effectuées?


Certaines informations supplémentaires sur la structure seraient utiles. Sans en savoir plus, j'importerais une partie du fichier dans une table de travail dans votre serveur cible et le traiterez de là, de cette façon, vous pouvez ajouter des clés et des indicateurs au besoin et utilisez les ressources disponibles sur votre serveur SQL pour gérer tout Erreurs de traitement.


@Fge Il existe d'autres services qui écrivent à cette table et si je crée un index unique, ils cesseront de travailler, non?


et cette table est d'environ 400 Go de taille, pas une chose cool à faire, je pense


4 Réponses :


5
votes

J'apporterais les lignes dans une table d'avion si cela provient d'une autre base de données - une identité qui a une identité. Ensuite, vous pouvez identifier les lignes dans lesquelles toutes les autres données sont identiques à l'exception de l'ID et supprimez les duplicats avant d'essayer de le mettre dans votre table de production.


0 commentaires

0
votes

avec des lignes en double, même Row_Number () va vous obtenir nulle part, car cela peut changer entre les requêtes (en raison de la manière dont MSSQL stocke les données). Vous devez l'apporter soit dans une table d'atterrissage avec une colonne d'identité ou ajouter une nouvelle colonne avec une identité sur la table existante ( Alter Table OldTBL Ajouter une colonne NeufID Int Identity (1,1) ). < / p>

Vous pouvez utiliser row_number () , puis sauvegarder les lignes "code> n si elles ont plus que le compte dans la nouvelle base de données, mais ce serait plus simple pour simplement utiliser une table d'atterrissage.


0 commentaires

0
votes

Option 1: Les doublons peuvent être supprimés

essayer de trouver une combinaison de champ un peu unique. (Des doublons sont autorisés) et joignez-vous sur un hachage du reste des champs que vous stockez dans la table de destination.

suppose une table: xxx

La raison d'essayer de rejoindre autant de champs que possible consiste à réduire les chances de collision de hachage qui sont réelles sur une Dataset avec 600.000.000 enregistrements.

Option 2: Les doublons sont importants

Si vous avez vraiment besoin des lignes en double, vous devez ajouter une colonne ID unique à votre grande table. Pour y parvenir de manière performante, vous devriez procéder comme suit:

  • modifier la table et ajoutez un site unique ou un champ Int
  • Mettez à jour la table avec la fonction nouvelle suivi /) ou une rangée ()
  • créer un index sur ce champ
  • Ajoutez le champ ID à votre table de destination.
  • Une fois que toutes les données sont déplacées, le champ peut être supprimé.


0 commentaires

1
votes

Ainsi, vous chargez des lignes de données de bazillions de mulsté, les lignes ne peuvent pas être identifiées de manière unique, la charge peut (et, apparemment, la volonté) d'être interrompue à tout moment, et vous voulez pouvoir reprendre une telle Charge interrompue de l'endroit où vous vous êtes laissé, malgré le fait que, pour tous les fins pratiques, vous ne pouvez pas identifier où vous vous êtes laissé. Ok.

Le chargement dans une table contenant une colonne d'identité supplémentaire fonctionnerait, en supposant que cependant et chaque fois que la charge de données soit démarrée, elle commence toujours sur le même élément et charge des éléments dans le même ordre. Sauvagement inefficace, puisque vous devez lire tout autre temps chaque fois que vous lancez.

Une autre option clunky serait de commencer à briser les données que vous chargez dans des morceaux de taille propre (peut-être 10 000 000 rangées). Chargez-les du morceau de morceau, gardant une trace de laquelle le morceau que vous avez chargé. Utilisez une table de mise en scène afin que vous sachiez et pouvez contrôler quand un morceau a été «entièrement traité». Si / lorsqu'il est interrompu, vous ne jetez que le morceau que vous travailliez lorsqu'il est interrompu et reprendra votre travail avec ce morceau.


0 commentaires