2012-07-22 88 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;