TSQL - 克隆一天的记录

TSQL - clone records for a day

我正在努力创建一个带有大型 MSSQL 数据库的实验室。 为了简化问题,假设它仅适用于 1 table(如果我能找到更好的解决方案,我可以为所有 table 解决)

我在 table 中有 1 天的数据,比如 525k 到 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<=@iDate
Begin 
    Set @TmpDate = @DateStart-@iDateCnt
    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 

一次执行一个插入操作总是很慢,尤其是对于大量索引 table。

相反,您应该将其作为单个插入来执行,类似于

DECLARE @startDate DATETIME = '2015-12-22'
DECLARE @endDate = DATEADD(days,365, @startDate)

Insert into Table1 (F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11)        
Select F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() 
FROM Table1 where F1 > @startDate AND F1 <= @endDate

要将我的评论表述为答案,您首先要创建一个 table,它有一个日期时间列,其中一行代表您要用克隆数据填充的每个日期。假设我们称它为 tblDates。然后你只需对现有脚本执行此操作:

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

    Insert into Table1 (F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11)
        Select tblDates.DtColumn as F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, getdate() as F11
        from #Tmp_Table1
        CROSSJOIN tblDates

    Drop #Tmp_Table1
End 

这将为 tblDates 中的每一行创建 #TMP_Table1 中所有数据的副本,在 F1 列中包含 tblDates 的日期(您在其中之前使用循环变量)。