web-dev-qa-db-fra.com

Très grandes ensembles de résultats SQL Server 2016 (plus de 75 Go) dans un fichier CSV?

Quelle est la meilleure façon d'obtenir de très grands ensembles de résultats SQL Server 2016 (plus de 75 Go) dans un fichier CSV? Les ingénieurs ont besoin de cette sortie pour rechercher des corrélations.

Le bcp route pour un fichier de 73,5 Go rempli de TEMPDB et a commencé à planter d'autres applications, y compris le processus ETL.

Nos utilisateurs veulent exporter jusqu'à 500 Go.

Quel processus utiliserait le moins de ressources afin que d'autres applications continuent à courir?

6
Alex

Moi aussi, j'ai eu des problèmes d'exportation d'importants ensembles de résultats (7 à 8 Go) aux fichiers délimités. Ni SQLCMD ni BCP ni SSIS ne peuvent gérer les ensembles de résultats dynamiques, la qualification de texte dynamique, l'ajout d'une rangée d'en-tête de colonne, etc. Donc, j'ai construit mon propre outil pour gérer cela. Il sort actuellement comme le db_bulkexport Procédure stockée dans la bibliothèque SQL # SQLCLR (que j'ai écrit), bien que le plan soit Éliminez-le dans un utilitaire d'exportation autonome et étendez-vous sur les fonctionnalités.

Veuillez noter que le db_bulkexport La procédure stockée est uniquement disponible dans la version complète (payante) de SQL # (c'est-à-dire qu'elle n'est pas dans la version gratuite), mais Je ne suis pas au courant d'une utilité gratuite de faire ce type de chose (par conséquent, pourquoi j'ai écrit le mien).

En ce qui concerne l'exportation de grands ensembles de résultats: je n'ai pas jusqu'à présent de problèmes de mémoire car il écrit chaque rangée dans le fichier tel qu'il est lu à partir du jeu de résultats.

Si vous n'avez besoin que de cette exportation pour une seule table/une requête qui ne change pas vraiment en termes de structure/schéma, il peut être préférable d'écrire vous-même une petite application spécialisée vous-même, dans .NET ou PowerShell. La partie délicate consiste à gérer des exigences dynamiques. Mais si vous savez ce que les colonnes sont nommées et que les types de données, etc., il devrait s'agir d'une simple question d'ouverture du fichier de sortie, d'exécuter la requête, puis de chaque ligne du SqlDataReader juste String.Concat Tout ensemble, y compris la qualification de texte si nécessaire et en appliquant des spécificateurs de format appropriés en cas de besoin (c'est-à-dire des valeurs de date (heure)).

7
Solomon Rutzky

PowerShell peut bien fonctionner pour vous.

Invoke-Sqlcmd -ServerInstance $SQLServer -Database $DBName -Query $ExportSQL | Export-CSV -Path $ExportFile -NoTypeInformation

Invoke-SQLCMD est inclus dans le module SqlServer de Microsoft (Install-Module sqlserver).

Je ne suis pas super sûr, mais supposez que Invoke-SQLCMD utilise exécutereader qui diffuse des données et n'utilise pas la mémoire.

Versions antérieures de PowerShell Fonctions CSV excessivement enregistrées, assurez-vous d'essayer avec une version plus récente.

4
Chrissy LeMaire