Подтвердить что ты не робот

Как скопировать огромные данные таблицы в другую таблицу в SQL Server

У меня есть таблица с 3,4 миллионами строк. Я хочу скопировать все данные в другую таблицу.

Я выполняю эту задачу, используя следующий запрос:

select * 
into new_items 
from productDB.dbo.items

Мне нужно знать наилучший способ выполнения этой задачи.

4b9b3361

Ответ 1

Если вы копируете новую таблицу, самый быстрый способ - это, вероятно, то, что у вас есть в вашем вопросе, если ваши строки не очень большие.

Если ваши строки очень большие, вы можете использовать функции объемной вставки в SQL Server. Я думаю, вы можете назвать их с С#.

Или вы можете сначала загрузить эти данные в текстовый файл, а затем выполнить массовое копирование (bcp). Это дает дополнительное преимущество, позволяя вам игнорировать ключи, индексы и т.д.

Также попробуйте утилиту импорта/экспорта, поставляемую с SQL Management Studio; не уверен, будет ли это так же быстро, как прямое копирование навалом, но оно должно позволить вам пропустить промежуточный шаг записи в виде плоского файла и просто скопировать прямо из таблицы в таблицу, что может быть немного быстрее, чем ваш оператор SELECT INTO.

Ответ 2

У меня была та же проблема, за исключением того, что у меня есть таблица с 2 миллиардами строк, поэтому файл журнала будет расти до конца, если я это сделаю, даже если модель восстановления установлена ​​в Bulk-Logging:

insert into newtable select * from oldtable

Итак, я работаю над блоками данных. Таким образом, если передача перепутана, вы просто перезапустите ее. Кроме того, вам не нужен файл журнала размером с таблицу. Вы также, кажется, получаете меньше ввода-вывода tempdb, не знаете почему.

set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = isNull(max(id),0) + 1
from newtable

select @LastID = max(ID)
from oldtable

while @StartID < @LastID
begin
    set @EndID = @StartID + 1000000

    insert into newtable (FIELDS,GO,HERE)
    select FIELDS,GO,HERE from oldtable (NOLOCK)
    where id BETWEEN @StartID AND @EndId

    set @StartID = @EndID + 1
end
set identity_insert newtable off
go

Возможно, вам придется изменить способ обращения с идентификаторами, это лучше всего работает, если таблица сгруппирована по идентификатору.

Ответ 3

Я работал с нашим администратором баз данных, чтобы скопировать таблицу аудита с 240-мегабайтными строками в другую базу данных.

Используя простой select/insert, вы создали огромный файл tempdb.

С помощью мастера импорта/экспорта обработано, но скопировано 8M строк в 10 минут

Создание настраиваемого пакета SSIS и настройка параметров, скопированных 30M строк в 10Min

Пакет SSIS оказался самым быстрым и эффективным в наших целях

Earl

Ответ 4

Вот еще один способ передачи больших таблиц. Я просто передал 105 миллионов строк между двумя серверами, используя это. Очень быстро.

  • Щелкните правой кнопкой мыши базу данных и выберите "Задачи/Экспорт данных".
  • Мастер проведет вас через эти шаги, но вы выберете клиента SQL-сервера, так как источник данных и целевой объект позволят вам выбрать базу данных и таблицы, которые вы хотите перенести.

Для получения дополнительной информации см. https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/

Ответ 5

Если это импорт в 1 раз, утилита импорта/экспорта в SSMS, вероятно, будет работать самой простой и быстрой. Кажется, что SSIS работает лучше для импорта больших наборов данных, чем прямой INSERT.

BULK INSERT или BCP также могут использоваться для импорта больших наборов записей.

Другой вариант - временно удалить все индексы и ограничения в импортируемой таблице и добавить их после завершения процесса импорта. Прямой INSERT, который ранее провалился, может работать в этих случаях.

Если вы имеете дело с тайм-аутами или проблемами блокировки/блокировки при переходе из одной базы данных в другую, вы можете подумать о переходе от одного дБ в TEMPDB, а затем переходить из TEMPDB в другую базу данных, поскольку это минимизирует последствия блокировки и блокирующие процессы с обеих сторон. TempDB не будет блокировать или блокировать источник, и он не задерживает назначение.

Это несколько возможных вариантов.

- Эрик Айзекс

Ответ 6

Простая вставка/выбор sp работают отлично, пока количество строк не превысит 1 мил. Я наблюдал, как файл tempdb взрывается, пытаясь вставить/выбрать 20 мил + строк. Самое простое решение - это SSIS, установив размер буфера пакетной строки равным 5000, а размер буфера фиксации - 1000.

Ответ 7

Если вы сосредоточены на архивировании (DW) и имеете дело с VLDB с секционированными таблицами 100+, и вы хотите изолировать большую часть этих ресурсоемких работ на непроизводственном сервере (OLTP), вот предложение (OLTP → DW) 1) Используйте резервное копирование/восстановление для передачи данных на сервер архивации (так что теперь в Archive или DW у вас будет база данных Stage и Target) 2) База данных Stage: используйте переключатель раздела для перемещения данных в соответствующую таблицу этапов
3) Используйте SSIS для передачи данных из поэтапной базы данных в целевую базу данных для каждой поэтапной таблицы с обеих сторон. 4) Целевая база данных: используйте переключатель разделов в целевой базе данных для перемещения данных из этапа в базовую таблицу. Надеюсь, это поможет.

Ответ 8

выберите * в new_items из продуктаDB.dbo.items

Это в значительной степени. Это самый эффективный способ сделать это.