Как скопировать огромные табличные данные в другую таблицу в 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 миллионов строк между двумя серверами, используя это. И довольно быстро.
- щелкните правой кнопкой мыши на базе данных и выберите Задачи / Экспорт Данных.
- мастер проведет вас через шаги, но выбор клиента 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.предметы
это в значительной степени так. Это самый эффективный способ сделать это.