Le moyen le plus rapide pour insérer en parallèle à une seule table
Mon entreprise est maudit par un partenariat symbiotique tourné parasitaires. Pour obtenir nos données à partir du parasite, nous devons avoir recours à une lente et douloureuse de connexion odbc. J'ai remarqué récemment que je peux obtenir plus de débit en exécutant des requêtes en parallèle (même sur la même table).
Il ya une très grande table que je veux extraire des données à partir et de le déplacer dans nos locaux à la table. L'exécution de requêtes en parallèle je peux obtenir des données plus rapidement, mais j'imagine aussi que cela pourrait provoquer des problèmes avec le fait d'essayer d'écrire des données à partir de plusieurs requêtes dans la même table à la fois.
Quels conseils pouvez-vous me donner sur la meilleure façon de gérer cette situation afin que je puisse profiter de l'augmentation de la vitesse de l'aide de requêtes en parallèle?
EDIT: j'ai eu d'excellents commentaires ici, mais je pense que je n'étais pas complètement clair sur le fait que je suis en tirant des données via un serveur lié (qui utilise les pilotes odbc). En d'autres termes cela signifie que je peux exécuter normale instructions INSERT et je crois, qui fournit de meilleures performances que soit SqlBulkCopy ou d'INSERTION en bloc (en fait, je ne crois pas BULK INSERT serait même une option).
Êtes-vous à la migration des données? Je demande parce que vous avez dit que votre déplacement de données pour les tables locales. Aussi, comment faites-vous cela dans le code par exemple c# ou dans le cadre d'un travail sql?
Oui, mais les nouvelles données ne rentre pas dans notre base de données donc je vais devoir copier quelque chose de nouveau sur une base quotidienne. Jusqu'à présent, j'ai été faire dans ssms par la main, mais l'idée parallèle sera fait en c# si je le fais. Ne va probablement pas faire un parallèle b/c j'ai eu toutes les données historiques maintenant et vraiment juste besoin de l'installation d'un travail sql à exécuter et obtenir de nouvelles données tous les soirs. Mais je voulais juste avoir quelques infos sur l'idée b/c je peut l'utiliser que dans un proche avenir sur d'autres trucs.
Pas vraiment sûr si cela est applicable, mais avez-vous pensez à l'enregistrer vos requêtes en parallèle les résultats de séparer les tables locales de "concaténer" par la suite?
En fait, je ne pense à ce sujet... et puis je me suis demandé si ce serait utile si tout est fait sur le même disque dur, ou si j'avais besoin de tables sur des hd, pour que ce soit une aide significative. J'ai aussi pensé à stocker dans la mémoire de la table des variables qui je pense serait plus rapide, mais aussi plus de l'effort de développement du moi.
OriginalL'auteur Brandon Moore | 2012-06-19
Vous devez vous connecter pour publier un commentaire.
Avez-vous lu Charge de 1 to à moins de 1 heure?
Pour SQL Server 2008, il ya certaines circonstances où vous pouvez utiliser journalisation minimale pour un INSERT standard SÉLECTIONNEZ:
Êtes-vous à l'aide de SQL Server 2008 ou supérieur? Journalisation minimale sur le standard INSÉRER les instructions SELECT est pris en charge sous certaines conditions.
OriginalL'auteur 8kb
Si vous cherchez à faire dans le code ie c# il y a la possibilité d'utiliser
SqlBulkCopy
(dans le Système.Les données.SqlClient) et comme cet article le suggère, il est possible de le faire en parallèle.http://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html
Eh bien, je pensais seulement à l'aide de c# pour gérer la parallélisation. Je ne pense pas que l'aide SqlBulkCopy serait plus rapide que l'utilisation SqlCommand.ExecuteNonQuery() pour émettre le même définis en fonction de l'instruction insert, je le ferais directement à partir de SSMS, pensez-vous? Je pense que les personnes répondant à garder d'oublier, c'est que ce n'est pas à venir à partir d'un fichier plat... j'ai accès à des instructions insert directement sur la source de données.
Je suppose que quand vous dites cela "les mêmes définis en fonction de l'instruction insert" vous voulez dire que vous êtes capable de faire une croix de la base de données rejoindre? Aussi êtes-vous essayer de les insérer dans la source, ou avez-vous juste dire que vous avez accès en lecture/écriture à la base de données source (mais est fondamentalement hors de propos avec ce que vous essayez de faire ici)?
OriginalL'auteur Chris Moutray
Si par hasard, vous avez mis à niveau vers SQL 2014, vous pouvez insérer en parallèle (niveau de compatibilité doit être 110). Voir ceci:
http://msdn.microsoft.com/en-us/library/bb510411%28v=sql.120%29.aspx
OriginalL'auteur Fat Shogun