Я работаю над созданием Лаборатории с большой базой данных MSSQL. Чтобы упростить эту проблему, предположим, что это только для 1 таблицы (если я могу найти лучшее решение, я могу сделать это для всех таблиц)TSQL - записи клонов за день
У меня есть данные за 1 день в таблице, скажем между 525 и 630k записей. Я хочу дублировать данные для разных дней (создать историю).
Я уже пробовал разные способы, и я нахожу это очень долго. изначально процесс забирал 91 час, чтобы дублировать 1 день ... Я перенес его на 16 минут, чтобы обработать 1 день (что составляет около 91 часа, чтобы дублировать год). Мне интересно, есть ли какой-нибудь инструмент или что-то сделанное для дублирования данных или создания истории быстро?
Вот что я прямо сейчас:
Declare @iDateCnt int=1,
@TmpDate datetime,
@iDate int=365, -- counter to create a years worth of history.
@DateStart datetime = '2015-12-22'
Select F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() as F11
into #TMP_Table1
From Table1 where F1 = @DateStart -- Template Day to be duplicated
While @iDateCnt<[email protected]
Begin
Set @TmpDate = @[email protected]
Delete from Table1 where F1 = @TmpDate
Insert into Table1 (F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11)
Select @TmpDate as F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() as F11
from #Tmp_Table1
Drop #Tmp_Table1
End
Причина, по которой это так медленно, вы делаете по одной записи за раз в цикле. SQL не может иметь никакого шанса оптимизировать это, он (скорее всего) будет работать в секундах как пакет. – Jamiec
Создайте таблицу дат (или CTE), которая содержит одну строку для каждой даты, которую вы хотите заполнить, а затем перейдите в эту таблицу вместо того, чтобы запускать цикл. –
Почему вы используете цикл while для этого? В этом суть проблемы производительности. Это можно переписать в виде вставки, основанной на одном наборе. –