2012-07-22 50 views
0

需要生成一些测试数据。这个插入是800,000 X 1,000。我知道很多,但这是一个真正的应用程序,随机数将是一个计算的数字。TSQL插入事务日志填充

我该如何分解这个事务日志不填满?

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

您意识到您将需要提供以每行20个字节提供12,8TB的存储空间吗?我认为你的方法**不会工作**,即使没有tlog问题。 – usr 2012-07-22 18:42:23

+1

@marc_s,您提到了这一点,但是一个toooooo大事务(比最大可能的日志/磁盘大小“大”)不适合任何事务日志管理策略。猜猜布莱姆问如何克服这种情况。 – 2012-07-22 18:43:08

+0

您还要存储对(a,b)和(b,a)。如果您不想这样做,请添加where条件'docSVsys1.sID usr 2012-07-22 18:43:12

回答

1

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

下一步,或者如果你不能设置恢复模型,并允许登录到成长的第一步,分裂您插入语句到多重插入语句中加入WHERE子句这样的:

  1. 插入#1:其中docSVsys1.sID%2 = 0/*%表示moduo */
  2. 插入#2:其中docSVsys1.sID%2 = 1/*%表示moduo */

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

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

+0

我需要分解一次像docSVsys1.sID,并需要按顺序插入docSVsys1.sID,docSVsys2.sID或我将片段。我可以在.NET中循环。 – Paparazzi 2012-07-22 18:50:20

+0

好的,你可以在.NET中使用它,或者在TSQL中使用游标。 – 2012-07-22 19:08:04

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;