выбрать в вопросе SQL Server - PullRequest
       10

выбрать в вопросе SQL Server

2 голосов
/ 27 августа 2009

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

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

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

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

Какие-нибудь быстрые и простые решения?

спасибо заранее, George

Ответы [ 3 ]

3 голосов
/ 27 августа 2009

Добавьте несколько разделов, чтобы их не было, поэтому возьмите все сразу. Получайте данные за один месяц за один раз или все идентификаторы, заканчивающиеся определенным номером.

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

2 голосов
/ 27 августа 2009

Копирование в пакетном режиме

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'
1 голос
/ 28 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...