【发布时间】:2016-04-11 23:18:09
【问题描述】:
我正在创建一个带有大型 MSSQL 数据库的实验室。 为了简化问题,我们假设它仅适用于 1 个表(如果我能找到更好的解决方案,我可以对所有表都这样做)
我的表中有 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
【问题讨论】:
-
它这么慢的原因是你在一个循环中一次只做一个记录。 SQL 没有任何机会对其进行优化,它(很可能)会在几秒钟内作为批处理工作。
-
创建一个日期表(或 CTE),其中包含您要填充的每个日期的一行,然后交叉连接到该表而不是运行循环。
-
你为什么要为此使用while循环?这就是性能问题的症结所在。这可以重写为基于单个集合的插入。
-
@Tab Alleman 我认为这可能是个好主意。但我不确定我是否理解这将如何工作。我会删除不属于模板日期的任何内容并交叉连接日期表并使用日期表中的日期作为 F1 进行 1 次大插入。正确的?请添加为答案,我会投票作为我正在寻找的答案。
标签: sql-server tsql sql-server-2012 sql-server-2014