需要生成一些测试数据。此插入是800,000 X 1,000。我知道很多,但这是一个真正的应用程序,随机将是一个计算的数字。
如何解决此问题,以便事务日志不会填满?
insert into sIDcrossMatch
select
docSVsys1.sID, docSVsys2.sID, Abs(Checksum(NewId())) % 100 As RandomInteger
from docSVsys as docSVsys1
join docSVsys as docSVsys2
on docSVsys1.sID <> docSVsys2.sID
where docSVsys1.sID < 1000
order by docSVsys1.sID, docSVsys2.sID
它将插入一个docSVsys1.sID
而不填写事务日志。
答案 0 :(得分:1)
由于这是您的测试数据库,请确保先将Recovery model设为Simple,然后尽可能多地提供log grow,以便为其提供空间(如果需要,可添加更多文件)。并确保您了解这些设置的后果。
下一步或第一步,如果您无法设置恢复模型并允许日志增长,请通过添加如下所示的where子句将insert语句拆分为多个insert语句:
如果这还不够,请增加divider(2)并添加更多插入语句。多次插入背后的想法是使用更少的日志空间并重用日志空间。
或者,如果可能,请使用SSIS并在您的选择查询和一个目标组件中放置一个源组件(不要忘记设置批量大小)。
答案 1 :(得分:1)
正如@usr所指出的那样,数据太多了。应该事先做好数学。一个大数字的正方形是一个非常大的数字。这更适用于Azure表存储。这似乎有效。给检查菲利普。
DECLARE @sid int
DECLARE sID_cursor CURSOR FOR
SELECT top 10 sID
FROM docSVsys
ORDER BY sID
OPEN sID_cursor
FETCH NEXT FROM sID_cursor
INTO @sID
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @sID
insert into sIDcrossMatch
select @sid, docSVsys.sID, Abs(Checksum(NewId())) % 100 As RandomInteger
from docSVsys
where docSVsys.sID <> @sid
order by docSVsys.sID;
checkpoint;
FETCH NEXT FROM sID_cursor
INTO @sID
END
CLOSE sID_cursor;
DEALLOCATE sID_cursor;