#sql #sql-server-2008
#sql #sql-server-2008
Вопрос:
Я пытаюсь вставить несколько строк в простую таблицу в Sql Server 2008. В таблице нет никаких индексов, кроме первичного ключа.
Я выполняю вставки следующим образом
insert into TestTable
(Col1,Col2, Col3,Col4, Col5)
select 1,1,1,1,GETDATE()
union all
select 1,2,3,1,GETDATE()
union all
select 1,5,2,1,GETDATE()
union all
select 1,4,15,1,GETDATE()
Если я сделаю это для большого количества строк (скажем, 400) и выполню операцию несколько раз,
операция вставки начинает занимать огромное количество времени.
Есть ли какой-либо способ дальнейшей оптимизации вставок?
Комментарии:
1. Чего вы пытаетесь достичь?
2. Запуск 400 UNION определенно замедлит его — хотя я не уверен, что означает «огромное» количество времени. Это неправильный способ вставить 400 записей в таблицу.
Ответ №1:
insert into TestTable (Col1,Col2, Col3,Col4, Col5)
VALUES (1,1,1,1,GETDATE()), (1,1,1,1,GETDATE()), (1,1,1,1,GETDATE()), ...
Ответ №2:
убедитесь, что вы выполняете фиксацию достаточно часто. это должно уменьшить использование сегмента отката.
Ответ №3:
Вы можете попробовать разделить данные на фрагменты. Загрузите первые 100 записей, зафиксируйте, затем повторите. 400 записей — это не так много. Обычно вы можете вставлять тысячи записей одновременно. Все вставки записываются в журнал для целей отката. Файл журнала очищается при фиксации.
Ответ №4:
Вероятно, это время компиляции, а не время выполнения.
Если у вас есть 400 абсолютно одинаковых строк, то сначала сгенерируйте 400 строк
insert into TestTable
(Col1,Col2, Col3,Col4, Col5)
select
1,1,1,1,GETDATE()
FROM
(SELECT TOP 400 * FROM master.dbo.spt_values ORDER BY 1) foo
Комментарии:
1. Извините, я понял, что мой вопрос был не очень точным — на самом деле я не пытаюсь вставить идентичные строки.