TSQL插入事务日志填写

时间:2012-07-22 18:26:21

标签: sql-server tsql transaction-log

需要生成一些测试数据。此插入是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而不填写事务日志。

2 个答案:

答案 0 :(得分:1)

由于这是您的测试数据库,请确保先将Recovery model设为Simple,然后尽可能多地提供log grow,以便为其提供空间(如果需要,可添加更多文件)。并确保您了解这些设置的后果。

下一步或第一步,如果您无法设置恢复模型并允许日志增长,请通过添加如下所示的where子句将insert语句拆分为多个insert语句:

  1. 插入#1:其中docSVsys1.sID%2 = 0 / *%表示moduo * /
  2. 插入#2:其中docSVsys1.sID%2 = 1 / *%表示moduo * /
  3. 如果这还不够,请增加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;