2009-08-27 7 views
2

J'utilise SQL Server 2008 et j'ai besoin de sélectionner toutes les données d'une table d'un DB dans une autre table d'un autre DB sur la même instance SQL Server.sélectionnez dans l'édition de SQL Server

Voici mon script utilisant. Le serveur manquera de mémoire. Les données sont grandes - la taille de la table est d'environ 50G sur le disque. Toute solution alternative simple ou toute solution pour réduire la consommation de mémoire est bonne. Le serveur a 16G de RAM physique et est x64.

Voici la déclaration que je me sers,

insert into [TargetDB].[dbo].[Orders] 
select * 
from [SourceDB].[dbo].[Orders]; 

Les solutions rapides et simples?

merci à l'avance, George

Répondre

2

Copie par lots

INSERT INTO [TargetDB].[dbo].[Orders] 
SELECT TOP 100 * 
FROM [SourceDB].[dbo].[Orders] S 
WHERE NOT EXISTS 
(
SELECT 1 FROM [TargetDB].[dbo].[Orders] T1 
WHERE T1.OrderId = S.orderID 
) 

Cela devrait le faire en lots de 100, que vous pouvez modifier pour adapter le nombre d'enregistrements dont vous avez besoin pour traiter. Ce code ne suppose que vous avez une certaine forme de valeur unique, comme OrderId à des étouffoirs dans les données processus de copie

Copie dans des gammes

Si vous avez un champ, vous pouvez utiliser pour choisir « gammes » comme un OrderDate, commencez en exécutant une requête comme

SELECT OrderDate, COUNT(1) 
FROM [SourceDB].[dbo].[Orders] 

pour voir combien de valeurs distinctes il y a et le nombre d'enregistrements sont disponibles par valeur distincte. Cela devrait vous permettre de choisir des gammes - puis utiliser des requêtes à distance pour copier les données à travers (par exemple 2009-01-01> 2009-01-31.):

INSERT INTO [TargetDB].[dbo].[Orders] 
SELECT * 
FROM [SourceDB].[dbo].[Orders] 
WHERE OrderDate BETWEEN '2009-01-01 00:00:00.000' AND '2009-01-31 23:59:59.997' 
+0

Merci Rob, si j'ai besoin de copier toutes les données dans la table de la base de données de destination, comment écrire une boucle pour qu'elle complète toutes les choses dans certains lots? – George2

+1

@ George2 - Si c'est un processus unique, probablement plus facile à faire en gros morceaux manuellement pour donner à la base de données une «respiration» entre les lots, en particulier car vous avez déjà eu des problèmes de mémoire auparavant = – Rob

+0

Salut Rob, dans mon tableau, il n'y a pas de colonne qui pourrait être utilisée comme indicateur de plage. J'ai seulement un ID de type GUID qui est utilisé comme index cluster. Des idées pour ma solution? Je n'ai besoin d'aucun concept de fusion, la table de destination est vide et j'ai juste besoin de copier toutes les données source dans la table de destination. Merci encore! – George2

3

Ajouter une partition de sorte que vous n » Je l'ai donc pris tout à la fois. Obtenez des données pour un mois à la fois ou toutes les ID: s se terminant par un nombre spécifique.

De cette façon, chaque lot devient un peu plus petit.

+0

Merci idstam, actuellement seul ID est clustered clé primaire et il est de type GUID. J'ai une idée pour écrire une boucle et dans chaque itération copie un lot (par exemple 10.000 enregistrements par exemple pour chaque itération)? – George2

1

Vous pouvez envisager d'utiliser BCP pour copier en bloc les données.

Questions connexes