web-dev-qa-db-fra.com

Quel est le moyen le plus rapide d'exporter un tableau vers un fichier texte

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 un select * la commande et la boucle sur le datareader et l'écriture dans un fichier pour chaque enregistrement seront lentes et il n'y a aucun moyen de paralléliser cela.

Idéalement, l'exportation sera vers un dossier réseau partagé distant et non 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 SLA mais j'attends 30 minutes - 1 heure pour l'écriture du fichier.

17
softveda

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 :-).

10
Marian

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

4
Bacon Bits

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 des requêtes dans un fichier. Nous incorporons également le 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: https://stackoverflow.com/questions/10325338/fastest-way-to-export-blobs-from-table-into-individual -fichiers

2
brian

Vous pouvez créer un package SSIS simple:

Voici une procédure de haut niveau pour:

  1. Créer une connexion OLEDB à la base de données dans le gestionnaire de connexions
  2. Faites glisser une transformation de flux de données dans le flux de contrôle, puis cliquez dessus pour accéder au flux de données.
  3. Faites glisser une source OLEDB de la boîte à outils vers le flux de données et modifiez-la afin qu'elle se connecte à la table souhaitée à l'aide de la connexion que vous avez créée à l'étape 1
  4. Faites glisser une destination de fichier plat de la boîte à outils dans le flux de données et connectez-y la source OLEDB.
  5. Sélectionnez "Nouveau" dans la destination du fichier plat, et cela créera un nouveau fichier plat avec la même structure de colonnes, et vous pouvez utiliser le délimiteur souhaité, ou peut-être un fichier fixe avec si vous le souhaitez.
  6. Exécuter.

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..

1
Chef Slagle

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

0
bummi