2008-10-08 12 views
3

Je cherche à exécuter une série de requêtes dans le cadre d'un projet de migration. Les scripts à générer sont produits à partir d'un outil qui analyse la base de données existante puis produit un script pour mapper chacune des anciennes entités vers un nouvel enregistrement approprié. Les scripts fonctionnent bien pour les petites entités, mais certains ont des centaines de milliers de fichiers qui produisent des fichiers de script d'environ 80 Mo.Comment gérer les grandes insertions par lots SQL SERVER?

Quelle est la meilleure façon d'exécuter ces scripts?

Existe-t-il un SQLCMD à l'invite qui traite des scripts plus volumineux?

Je pourrais aussi décomposer les scripts en plus petits scripts mais je ne veux pas avoir à exécuter des centaines de scripts pour effectuer la migration.

Répondre

2

Si possible, modifiez l'outil d'exportation pour exporter un fichier compatible BULK INSERT. À défaut, vous pouvez écrire un programme qui va analyser les instructions d'insertion dans quelque chose que BULK INSERT acceptera.

0

Il semble que cela génère un INSERT pour chaque ligne, ce qui va être très lent. S'ils sont tous enveloppés dans une transaction, cela peut être plutôt lent (bien que le nombre de lignes ne semble pas si grand que cela rende une transaction presque impossible - comme si vous teniez une ligne de plusieurs millions insérer dans une transaction).

Il est peut-être préférable de regarder ETL (DTS, SSIS, BCP ou BULK INSERT FROM, ou un autre outil) pour migrer les données au lieu d'écrire des scripts pour chaque insertion.

Vous pouvez décomposer le script et l'exécuter en plusieurs parties (surtout s'il s'agit actuellement d'une grosse transaction), il suffit d'automatiser l'exécution des scripts individuels en utilisant PowerShell ou similaire.

0

Exécutez simplement le script. Nous exécutons régulièrement des scripts de sauvegarde/restauration d'une taille de 100 Mo. Cela ne prend que 30 secondes environ.

S'il est essentiel de ne pas bloquer votre serveur pour cette durée, vous devrez vraiment le diviser un peu.

Regardez également dans l'option -tab de mysqldump avec les sorties de données à l'aide de TO OUTFILE, qui est plus efficace et plus rapide à charger.

0

J'ai regardé dans le "BULK INSERT" de l'option de fichier mais ne peux pas voir des exemples du format de fichier. Le fichier peut-il mélanger les formats de ligne ou doit-il toujours être cohérent au format CSV? La raison pour laquelle je demande est que j'ai des identités impliquées à travers différentes tables parent/enfant, c'est pourquoi les inserts par ligne sont actuellement utilisés.

1

BULK INSERT utilise BCP format files which come in traditional (non-XML) or XML. Est-ce qu'il doit obtenir une nouvelle identité et l'utiliser dans un enfant et vous ne pouvez pas utiliser SET IDENTITY INSERT ON parce que la conception de la base de données a tellement changé? Si c'est le cas, je pense que vous feriez mieux d'utiliser SSIS ou similaire et de faire un Merge Join une fois les identités assignées. Vous pouvez également charger les données dans des tables de transfert dans SQL à l'aide de SSIS ou BCP, puis utiliser SQL normal (potentiellement dans SSIS dans une tâche SQL) with the OUTPUT INTO feature to capture the identities and use them in the children.

Questions connexes