Sql Server вставляет тайм-аут

#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. Извините, я понял, что мой вопрос был не очень точным — на самом деле я не пытаюсь вставить идентичные строки.