J'aurai une base de données SQL Server 2012 et une table avec 3 millions de lignes et peut-être 50 colonnes. Quel sera le moyen le plus rapide pour un processus .net en arrière-plan sans assistance (peut-être émet une commande SQL ou Powershell) de l'exporter vers un fichier texte, une ligne pour chaque ligne de données? Le processus .net doit savoir quand l'exportation a été terminée ou s'il y a eu une erreur. Le type de données sera tout int
ou nvarchar
.
Je suppose qu'un code C # pur utilisant ado.net pour exécuter une select *
commande et boucler sur le datareader et écrire dans un fichier pour chaque enregistrement sera lent et il n'y a aucun moyen de paralléliser cela.
Dans l'idéal, l'exportation se fera vers un dossier réseau partagé distant et non vers un dossier local sur la machine SQL Server. SQL Server sera un cluster HA. SSIS est-il mieux adapté à cela, aucune transformation de données requise?
Le processus .Net s'exécuterait sur la machine A, SQL Server sur la machine B et la destination de fichier ultime est un partage réseau. Une option est que SQL Server écrit le fichier directement sur le partage réseau. L'autre option est que SQL Server écrit sur la machine A, puis lorsque le fichier est écrit, le processus .net le copie sur le partage réseau. Je n'ai pas de SLA formel mais j'attends 30 minutes - 1 heure pour l'écriture du fichier.
la source
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."
- d'où l'application .NET sera-t-elle exécutée? Dans le pire des cas, cela pourrait signifier que les données doivent passer par 2 sauts de réseau, ce qui sera probablement le plus gros goulot d'étranglement. De plus, le nombre de lignes est quelque peu hors de propos - quelle est la taille totale approximative des données? Avez-vous un SLA de performance que vous devez rencontrer pour ce processus?Réponses:
Parcourir tous ces articles est une option si vous voulez vieillir en l'exécutant.
Voici différentes options que vous devriez essayer:
Et vous pouvez essayer toutes ces options tout en bouclant dans une autre session, juste pour le plaisir :-).
la source
J'utiliserais simplement l'assistant d'importation et d'exportation. À la fin, vous avez la possibilité d'enregistrer la tâche, que vous pouvez ensuite planifier avec SQL Server Agent. Ajoutez-vous en tant qu'opérateur et configurez DB Mail sur le serveur, et il peut vous envoyer un e-mail lorsque le travail se termine ou échoue.
Sérieusement, pourquoi réinventer la roue?
http://msdn.microsoft.com/en-us/library/ms140052.aspx
la source
D'autres ont déclaré que bcp devrait être le moyen le plus rapide mais je ne vois aucun avantage par rapport à une solution CLR. Lors des insertions dans les tables de base de données, les différentes implémentations de copie en bloc gagneront toujours. Cela est principalement dû à la façon dont ils minimisent la journalisation et activent les écritures multithread. Vous n'avez pas ces contraintes lors de l'écriture dans un fichier plat.
Dans mon travail, nous utilisons un CLR pour vider la sortie de la requête dans un fichier. Nous incorporons également le fichier Ionic.Zip.dll afin que le fichier puisse être automatiquement compressé après sa création.
Voici un exemple que l'op prétend être deux fois plus rapide que bcp sur les blobs: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files
la source
Vous pouvez créer un package SSIS simple:
Voici une procédure de haut niveau pour:
Tout noob devrait être capable de comprendre cela. Une personne anti-GUI n'aimerait pas cette solution, alors gardez les commentaires à ce sujet, c'est juste une alternative pour les individus moins avertis qui ont du mal à utiliser BCP ...
Vous avez un peu plus de flexibilité dans la mise en forme du fichier de données. Vous pouvez le faire dans BCP et tout cela, mais cela enlève de la complexité. Mais il y a un petit avantage car vous pouvez mettre un en-tête de fichier personnalisé et créer un "nom de colonne" comme première ligne, ce qui rend le fichier plat plus consommable par l'homme.
N'oubliez pas de l'enregistrer, si vous l'avez créé une fois, il vous sera probablement demandé à nouveau! J'espère que cela t'aides..
la source
Je pense que bcp.exe de la ligne de commande devrait être le moyen le plus rapide.
http://msdn.microsoft.com/en-us/library/ms162802.aspx
la source