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

17

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

softveda
la source
3
"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?
Jon Seigel

Réponses:

10

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

Marian
la source
4

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

Lardons
la source
Pas mal du tout, en fait, cela enregistre un package SSIS à la fin. S'il s'agit d'une tâche unique, cela peut être une solution.
Marian
2

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

Brian
la source
Cette question particulière n'est pas très détaillée. Je vous suggère de lire la question suivante - Optimisation des performances BCP pour les données BLOB ici. Cela vous donnera sûrement une idée des nombreuses options de jeu que vous avez avec BCP uniquement :-).
Marian
Je vois les liens et suis entièrement d'accord. Mais la plupart des points d'optimisation sont destinés au chargement des données dans le serveur SQL. Je n'ai pas encore vu de faits liés au fait que bcp soit plus rapide qu'une solution de streamwriter ou de filestream CLR lors de l'écriture de données sql dans un fichier plat.
brian
1

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

Chef Slagle
la source
0

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

bummi
la source
5
Bien que vous ayez raison, pourriez-vous nous éclairer sur les détails de cette solution? Comment il est utilisé (un lien vers les documents peut suffire), pourquoi pensez-vous que c'est le plus rapide, etc.
dezso