La parallélisation massive insère dans SQL Server à partir de C# (pour une meilleure performance en temps)

Énoncé du problème : Comment paralléliser insère dans SQL Server (2008)

Je suis l'exécution massive de calcul numérique pour la recherche scientifique en C# multithread travailleurs qui, fondamentalement, ne faire qu'une chose : Tester des milliers de configurations possibles (combinaisons de matrice) à travers une période de temps (en jours) et de stocker les résultats dans une Base de données SQL Server.

Si je stocker les résultats un par un en DB (~300.000 lignes par session informatique * 100 de séances), l'un après l'autre, j'ai attendu pendant des heures pour la procédure de sauvegarde à la fin.

La conception de base de données est très simple :

  • Combinaison Des Ensembles De

    CS_ID1, la Valeur de A1, la Valeur de B1, la Valeur C1

    CS_ID2, la Valeur de A2, Valeur B2, la Valeur de C2

    .........

  • Résultats par Jour

    CS_ID1, Day1,Résultat 1

    CS_ID1, Day2,Résultat 2

    CS_ID1, Jour3,Résultat: 3

    .........

    .........

    CS_ID2, Day1, Résultat N

    CS_ID2, Day2, Résultat N+1

    CS_ID2, Jour3, Résultat N+2

Chaque "Combinaison" est testé par rapport à l'échantillon jours et son par-résultats de la journée sont traitées dans un seul C# thread, où une LINQ/requête SQL est généré et envoyé à DB, juste avant la fin du thread. À l'exception de combinaison des Id de séquences, il n'y a PAS de relation logique entre les Résultats. Ceci est très important : C'est pourquoi j'ai pensé à la parallélisation de l'insérer des trucs comme essentiellement, il s'élève à un bulk dump de blocs de résultats

Un autre détail qui peut être important, c'est que il est possible de déterminer à l'avance combien de lignes sont insérées dans la Base de données (par bloc et au total). C'est probablement ce qui pourrait aider à organiser des espaces de tables, de les diviser par le biais de pages, pré-fix id plages afin de stocker les blocs simultanément, ou quelque chose comme ça (Non, je ne suis pas "élevé" ou quelque chose 🙂 )

Je souhaite la bienvenue à tout type de suggestions dans le but de rendre cette insérer un temps aussi court que possible.

Veuillez prendre en compte que je suis un développeur C#, avec de très de base SQL Server connaissance et pas très familier avec une profonde technique DBA concepts (j'ai vu que le Verrouillage des réglages sont TRÈS nombreux, qu'il y a multithread et asynchrone capacités, trop, mais je dois avouer que je suis perdu, seul, dans la forêt 🙂 )

J'Ai 12 Cœurs de PROCESSEUR disponibles, et 24Go de RAM


EDIT:
De bris d'égalité

Je souhaite la bienvenue à tout habile suggestion sur le temps de surveillance pour l'ensemble du processus : à Partir de C# threads début/fin détaillées sur SQl server insérer des états (Ce qui arrive quand, comment et où).

J'ai essayé de journalisation avec NLog mais de manière drastique les préjugés du temps de traitement je suis à la recherche pour certains smart solutions qui sont vraiment en douceur avec un minimum d'impact. De même pour le serveur SQL partie : je sais qu'il y a un couple de Journaux et de surveillance de la SP est disponible. Je n'ai pas encore lesquels fonction de ma situation.

  • Un collègue a suggéré de sérialiser les résultats sur binary/les fichiers texte et les jeter tous en DB à l'aide de l'instruction Bulk Insert à partir de fichiers plats... ce n'est Pas sûr que le fait d'être une bonne solution.
  • Je ne suis pas un DBA, mais je me demande deux choses ici: 1) oui, c'est ton CPU qui est de la limiter ou de disque? 2) le mécanisme de verrouillage de la DB en fait en parallèle des inserts? Si c'est le disque limité, et le SGBD n'a pas de lock-out de plusieurs processus, vous pouvez essayer de fractionnement de l'insertion de données sur plusieurs disques et bifurquer processus pour les insérer.
  • Est-ce suffisant pour diviser les requêtes via des connexions distinctes ? Comment SQL Server réagir à cela, "physiquement" ? Sont des éléments vraiment écrit simultanément dans la DB, à différentes positions de ligne ?
  • A partir de maintenant, je n'ai toujours aucune idée de savoir si le PROCESSEUR ou de la HD est de limiter le processus. Je me demande quelle est la meilleure chose à gérer cela, en général. Aussi loin que mes connaissances en va, même si le DB autorise de multiples processus, je ne sais pas si c'est possible pour deux (ou plus) à écrire sur la même table en même temps, est-ce que le tableau soit divisé entre différents HDs ou pas.