0

Need to generate some test data. This insert is 800,000 X 1,000. I know a lot but this is a real application where the random will be a calculated number.

How can I break this up so the transaction log does not fill up?

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

It will insert one docSVsys1.sID without filling up the transaction log.

4

2 に答える 2

1

これがテストデータベースであるため、最初にRecovery ModelをSimpleに設定してから、ログにスペースを確保できる範囲でログを拡大させます(必要に応じてファイルを追加します)。そして、これらの設定の結果を理解していることを確認してください。

次のステップ、またはリカバリモデルを設定できず、ログを拡大できない場合の最初のステップでは、次のようなwhere句を追加して、挿入ステートメントを複数の挿入ステートメントに分割します。

  1. 挿入#1:ここで、docSVsys1.sID%2 = 0 / *%はmoduoを意味します* /
  2. 挿入#2:ここで、docSVsys1.sID%2 = 1 / *%はmoduoを意味します* /

それでも不十分な場合は、仕切り(2)を増やし、挿入ステートメントを追加します。複数の挿入の背後にある考え方は、使用するログスペースを減らし、ログスペースを再利用することです。

または、可能であれば、SSISを使用して、選択クエリで1つのソースコンポーネントと1つの宛先コンポーネントを用意します(バッチサイズを設定することを忘れないでください)。

于 2012-07-22T18:34:13.617 に答える
1

@usr が指摘したように、これはデータが多すぎます。前もって計算しておくべきでした。大きな数の 2 乗は本当に大きな数です。これは、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 に答える