Comment copier une immense table de données dans une autre table dans SQL Server
J'ai une table avec 3,4 millions de lignes. Je veux copier cet ensemble de données dans une autre table.
Je suis l'exécution de cette tâche à l'aide de la requête ci-dessous:
select *
into new_items
from productDB.dbo.items
J'ai besoin de savoir la meilleure façon possible de faire cette tâche.
- ce sont 34 lac des enregistrements? MMillions? Pas hugh... accordé, pas un petit, mais pas hugh.
- Pourriez-vous définir temporairement le récupérer modèle à Simple?
- "Pas hugh...accordé" classique @TomTom!!
- Comment puis-je modifier de quelqu'un d'autre commentaire
InformationsquelleAutor sqlchild | 2011-03-14
Vous devez vous connecter pour publier un commentaire.
Si vous copiez dans un nouveau table, le moyen le plus rapide est probablement ce que vous avez dans votre question, sauf vos lignes sont très grandes.
Si vos lignes sont très grandes, vous pouvez utiliser le gros insérer des fonctions dans SQL Server. Je pense que vous pouvez appeler à partir de C#.
Ou vous pouvez tout d'abord télécharger les données dans un fichier texte, puis de copie en bloc (bcp) il. Cela a l'avantage de vous permettre d'ignorer les clés, index etc..
Aussi essayer l'utilitaire d'Importation/Exportation qui vient avec le SQL server Management Studio; pas sûr que ce sera aussi rapide qu'un droit de copie en bloc, mais il devrait vous permettre de sauter l'étape intermédiaire de l'écriture comme d'un fichier plat, et il suffit de copier directement de table en table, qui pourrait être un peu plus vite que votre
SELECT INTO
déclaration.Deferred prepare could not be completed. Query timeout expired (Microsoft SQL Server Native Client 10.0)
erreur.J'ai eu le même problème, sauf que j'ai une table avec 2 milliards de lignes, de sorte que le fichier journal d'une croissance sans fin si je l'ai fait, même avec le modèle de récupération mis en Vrac d'enregistrement:
Donc j'opère sur des blocs de données. De cette façon, si le transfert est interrompu, il vous suffit de redémarrer il. Aussi, vous n'avez pas besoin d'un fichier journal grand comme un tableau. Vous semblez aussi avoir moins de tempdb I/O, je ne sais pas pourquoi.
Vous pourriez avoir besoin de changer la façon dont vous traitez avec des Id, ce qui fonctionne le mieux si votre tableau est ordonné par ID.
J'ai travaillé avec notre DBA pour copier une table d'audit avec 240M lignes vers une autre base de données.
À l'aide d'un simple select/insert créé un énorme fichier de la base de données tempdb.
À l'aide d'un l'assistant Importation/Exportation travaillé copié, mais 8M lignes dans 10min
Créer un package SSIS et en ajustant les paramètres copiés à 30M lignes dans 10Min
Le package SSIS s'est avéré pour être le plus rapide et le plus efficace pour nos fins
Earl
Voici une autre façon de transférer de grandes tables. J'ai juste transféré de 105 millions de lignes entre deux serveurs à l'aide de ce. Assez rapide aussi.
Pour plus d'informations, voir https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/
Si c'est un 1 temps de l'importation, de l'utilitaire d'Importation/Exportation dans SSMS fonctionnera probablement la méthode la plus simple et la plus rapide. SSIS semble également fonctionner mieux pour l'importation de grands ensembles de données qu'une simple INSERTION.
BCP ou BULK INSERT peut également être utilisé pour importer des grands ensembles d'enregistrements.
Une autre option serait de supprimer temporairement tous les index et les contraintes sur la table que vous allez importer les données et de les ajouter une fois le processus d'importation terminé. Un droit d'INSÉRER qui, auparavant, ont échoué pourraient travailler dans ces cas.
Si vous avez à traiter avec des délais d'attente ou de verrouillage/problèmes de blocage lorsque vous allez directement à partir d'une base de données à un autre, vous pourriez envisager d'aller d'un db dans la base de données TEMPDB et ensuite à partir de la base de données TEMPDB dans l'autre base de données que l'on minimise les effets de verrouillage et de blocage des processus de chaque côté. La base de données TempDB de ne pas bloquer ou de verrouillage de la source et il ne tiendra pas jusqu'à la destination.
Ceux qui sont un peu d'options pour l'essayer.
-Eric Isaacs
Simple Insert/Select sp est de l'excellent travail jusqu'à ce que le nombre de lignes est supérieur à 1 mil. J'ai regardé la base de données tempdb fichier exploser en essayant d'insert/select de 20 mil + lignes. La solution la plus simple est SSIS réglage de la ligne de lot de la taille de la mémoire tampon de 5000 et de validation taille de la mémoire tampon de 1000.
Si votre objectif est d'Archivage (DW) et de traiter avec VLDB avec+ de 100 tables partitionnées et que vous souhaitez isoler la plupart de ces ressources travail intensif sur un autre serveur de production (OLTP), voici une suggestion (OLTP -> DW)
1) Utilisez l'utilitaire de sauvegarde /Restauration pour obtenir les données sur le serveur d'archives (donc, maintenant, d'Archives ou de DW, vous aurez la Scène et de la base de données Cible)
2) l'Étape de la base de données: Utilisation de commutation de partition pour déplacer des données à l'étape correspondante de la table
3) Utiliser SSIS pour transférer des données à partir de mises en scène de la base de données de la base de données cible pour chaque mise en scène de la table sur les deux côtés
4) la Cible de la base de données: Utilisation de la partition d'un interrupteur sur la base de données cible pour déplacer les données de la scène à la table de base
Espérons que cette aide.
C'est à peu près est-il. C'est le moyen le plus efficace de le faire.