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

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

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

select * 
into new_items 
from productDB.dbo.items

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

7 ответов


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

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

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

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


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

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

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


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

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

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

создание пользовательского пакета служб SSIS и настройка параметров скопированы 30M строк в 10Min

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

Ярл


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

  1. щелкните правой кнопкой мыши на базе данных и выберите Задачи / Экспорт Данных.
  2. мастер проведет вас через шаги, но выбор клиента SQL server в качестве источника данных и цели позволит вам выбрать базу данных и таблицы, которые вы хотите передать.

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


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

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

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

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

Это несколько вариантов, чтобы попробовать.

-Эрик Айзекс!--1-->


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


выберите * в new_items из productDB.dbo.предметы

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