0

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

4

2 回答 2

1

由于那是您的测试数据库,因此请先确保您的恢复模型为 Simple,然后让日志尽可能多地增长(如果需要,添加更多文件)。并确保您了解这些设置的后果。

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

  1. 插入 #1: where docSVsys1.sID % 2 = 0 /* % 表示模数 */
  2. 插入 #2: where docSVsys1.sID % 2 = 1 /* % 表示模数 */

如果这还不够,请增加分隔符 (2) 并添加更多插入语句。多次插入背后的想法是使用更少的日志空间并重用日志空间。

或者,如果可能的话,请使用 SSIS 并使用一个带有选择查询的源组件和一个目标组件(不要忘记设置批量大小)。

于 2012-07-22T18:34:13.617 回答
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;
于 2012-07-22T19:22:33.387 回答