2015-03-25 2 views
0

Nous avons une application .NET (C#) qui exécute environ 10 à 30 instructions d'insertion dans une base de données SQL Server toutes les secondes. Lorsque l'application a été conçue, la ou les applications exécutant les insertions étaient sur le site avec la base de données Sql Server, de sorte que la latence du réseau n'était pas vraiment prise en compte. Bien au moins la latence du réseau comme vous obtenez sur un WAN ou sur Internet n'a pas été comptabilisée.Comment gérer efficacement les opérations de base de données séquentielles sur un réseau étendu

L'application exécute ces insertions de manière séquentielle. Ainsi, si les 10 à 30 inserts prennent plus d'une seconde, l'application commence à se mettre en retard. Le système de mise en mémoire tampon que nous avons mis en place ne gère que le «hiccup» occasionnel dans la latence du réseau, en supposant que la latence du réseau finira par disparaître et l'application aura une chance de rattraper son retard.

Dans le cas où la latence du réseau est constamment suffisamment élevée pour que les 10 à 30 insertions prennent toujours plus d'une seconde, l'application devient bien sûr inutilisable. Par souci de cette question, supposons simplement qu'il n'y a rien que nous puissions faire pour réduire la latence du réseau, ou augmenter les performances du serveur SQL, ou quoi que ce soit de ce genre et que les commandes d'insertion 10-30 vont toujours prendre plus d'une seconde et faire en sorte que l'application arrive à un point de défaillance.

Existe-t-il un bon moyen, en .NET ou sur le serveur Sql lui-même, d'exécuter ces commandes en parallèle afin d'utiliser la bande passante pour compenser la latence? Je me rends compte que nous pourrions écrire notre propre système pour gérer tout cela, mais il semble que ce serait un problème commun avec les serveurs de base de données cloud déjà. J'ai lu sur le traitement par lots et l'utilisation des transactions pour envoyer plus de commandes à la fois sur le tuyau, mais même en faisant cela, il semble que cela finirait par frapper un mur si la latence du réseau était suffisamment élevée.

Nous souhaitons que l'application tolère une latence de plus en plus élevée, mais ne soit pas trop loin derrière les insertions.

+0

Existe-t-il de toute façon que vous pouvez exécuter SQLExpress localement et utiliser la réplication SQL pour gérer la synchronisation pour vous? –

+0

Malheureusement non, nous avons d'abord pensé à le faire au début. Nous avons une contrainte de sécurité que les données ne peuvent pas résider localement sur le disque et doivent être transférées directement de la mémoire. – Mike

Répondre

0

Il y a deux techniques que vous pouvez utiliser pour ce printemps.

Batching

Mettez tous les inserts dans un SQLCommand.

string sql = "insert into a (...) values (...);insert into a (...) values (...);....."; 

Cela devra être construit dynamiquement, et à moins que les valeurs que vous pré-nettoyés doivent utiliser des paramètres au lieu d'incorporer les valeurs dans le sql. Cela fera tous les inserts dans un voyage sur le réseau, minimisant ainsi la latence. Toutefois, si les données que vous insérez s'étendent sur plusieurs tables qui ont des relations FK entre elles et que le FK d'un enfant est une colonne IDENTITY dans la table parent nouvellement insérée, cela ne fonctionnera pas. Cependant, tout n'est pas perdu.

Tables Mise en scène avec Batching plus un SP

Créer un ensemble de tables contenant les données que vous devez insérer, mais y compris les relations FK qui pourraient exister réellement dans les tableaux finaux. Regroupez les insertions pour insérer vos données dans les tables de transfert, puis appelez un fournisseur de services qui peut déplacer les données des tables de transfert dans les tables finales tout en préservant les relations entre elles. Cela vous ramène à deux allers-retours réseau au lieu de 10 à 30, ce qui devrait aider.

+0

Avec SQLServer, vous pouvez réellement combiner ces insertions en une seule instruction. 'insérer dans un (...) VALEURS (...), (...), (...)' –

+0

Je ne le savais pas, merci! –