2009-08-27 5 views
2

Я использую SQL Server 2008, и мне нужно выбрать все данные из одной таблицы одного БД в другую таблицу другого БД на том же экземпляре SQL Server.выберите в вопрос SQL Server

Вот мой сценарий, используя. На сервере закончится нехватка памяти. Данные большие - таблица размером около 50G на диске. Любое легкое альтернативное решение или любое решение для снижения потребления памяти - это хорошо. Сервер имеет 16 Гбайт физической памяти и x64.

Вот заявление, я использую,

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

Любые быстрые и простые решения?

спасибо заранее, Джордж

ответ

2

Копирование в пакетах

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 
) 

Это должно сделать это в партиях от 100, которые можно подобрать, чтобы удовлетворить количество записей, которые необходимо обработать. Этот код делает предположит, что у вас есть какая-то форма уникального значения, такие как OrderId к ключу от в данных процессе копирования

Копировать в диапазонах

Если у вас есть поле, которое вы можете использовать, чтобы выбрать «Диапазоны» такие как OrderDate, начать с выполнением запроса, как

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

, чтобы увидеть, как много различных значений есть и сколько записей есть в отдельную стоимость. Это позволит вам выбрать несколько диапазонов - и затем использовать дистанционные запросы для копирования данных через (например, 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

Спасибо, Роб, если мне нужно скопировать все данные в таблицу целевых баз данных, как написать цикл, чтобы он мог завершить все вещи в некоторых партиях? – George2

+1

@ George2 - Если это одноразовый процесс, возможно, проще сделать это в больших кусках вручную, чтобы дать базе данных возможность «дышать» между партиями, особенно, когда вы перенесли проблемы с памятью ранее =) – Rob

+0

Hi Rob, в моем таблицы, нет колонки, которая может использоваться как индикатор диапазона. У меня есть только идентификатор типа GUID, который используется как кластерный индекс. Любые идеи для моего решения? Мне не нужна никакая концепция слияния, таблица назначения пуста, и мне просто нужно скопировать все исходные данные в таблицу назначения. Еще раз спасибо! – George2

3

Добавьте перегородки, так что вы не» Так что все это сразу. Получайте данные в течение одного месяца или все ID: s, заканчивающиеся на определенный номер.

Таким образом, каждая партия становится немного меньше.

+0

Спасибо idstam, в настоящее время только идентификатор является кластеризованным первичным ключом и имеет тип GUID. У меня есть идея написать цикл и в каждой итерационной копии пакет (например, 10 000 записей, например, для каждой итерации)? – George2

1

Возможно, вы захотите изучить использование BCP для массового копирования данных.

Смежные вопросы