Inserts rapides; BulkCopy avec des données relationnelles

insert sql sqlbulkcopy sql-server

Question

J'ai une grande quantité de données entrantes en permanence (environ 10 000 par minute et en croissance) que je souhaite insérer dans une base de données aussi efficacement que possible. Pour le moment, j'utilise des instructions insert préparées, mais je pense utiliser la classe SqlBulkCopy pour importer les données en plus gros morceaux.

Le problème est que je n'insère pas dans une seule table - des éléments de l'élément de données sont insérés dans de nombreuses tables et leurs colonnes d'identité sont utilisées comme clés étrangères dans d'autres lignes insérées en même temps. Je comprends que les copies groupées ne sont pas conçues pour permettre des insertions plus complexes comme celle-ci, mais je me demande s’il est utile d’échanger mes colonnes d’identité (bigints dans ce cas) contre des colonnes d’identificateur unique. Cela me permettra de faire quelques copies en bloc pour chaque table et, comme je peux déterminer les ID avant l'insertion, je n'ai pas besoin de rechercher quoi que ce soit comme SCOPE_IDENTITY qui m'empêche d'utiliser la copie en bloc.

Cela vous semble-t-il une solution viable ou existe-t-il d'autres problèmes potentiels auxquels je pourrais être confronté? Ou bien, y a-t-il un autre moyen d'insérer des données rapidement, tout en conservant mon utilisation des colonnes d'identité bigint?

Merci.

Réponse acceptée

On dirait que vous envisagez d'échanger "SQL assigne une clé de substitution [colonne bigint identity ()]" avec une méthode "de préparation de données évaluant une clé de substitution GUID". En d'autres termes, la clé ne sera pas affectée dans SQL, mais en dehors de SQL. Compte tenu de vos volumes, si le processus de génération de données peut attribuer une clé de substitution, j'y reviendrais sans hésiter.

La question devient alors, devez-vous utiliser des GUID ou votre processus de génération de données peut-il générer des entiers auto-incrémentés? Il est difficile de créer un tel processus cohérent et infaillible (une des raisons pour lesquelles vous payez $$$ pour SQL Server), mais le compromis pour des clés plus petites et plus lisibles dans la base de données pourrait en valoir la peine.


Réponse populaire

uniqueidentifier va probablement aggraver les choses: page splits and wide. Voir ce

Si votre charge est / peut être mise en lot, une des options est de:

  • vous chargez une table de préparation
  • charge les vraies tables en une fois en tant que procédure stockée
  • utiliser un identifiant unique dans la table de transfert pour chaque lot

Nous nous occupons de pics d’environ 50 000 lignes par seconde (et augmentons de cette façon). Nous utilisons en fait une base de données intermédiaire distincte pour éviter la double écriture dans le journal des transactions)



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi