【问题标题】:TSQL Insert Transaction Log Filling upTSQL 插入事务日志填满
【发布时间】:2012-07-22 18:26:21
【问题描述】:

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

【问题讨论】:

  • 您意识到您需要提供 12,8TB 的存储空间,每行 20 字节?我认为即使没有 tlog 问题,您的方法也永远行不通
  • @marc_s,您说得很对,但是一个太大的事务(“大于”最大可能的日志/磁盘大小)不适合任何事务日志管理策略。 Guess Blam 询问如何克服这种情况。
  • 您还存储对 (a, b) 和 (b, a)。如果您不想这样做,请添加 where 条件 docSVsys1.sID &lt; docSVsys2.sID
  • @usr,我没有做数学,测试数据的空间太大了 :) 如果 SQL 2005 或更高版本,他可以尝试为特定测试表打开数据压缩。跨度>
  • @marc_s 是的,你可以通过拆分它。检查点上的简单日志记录截断日志。我说过一个 docSVsys1.sID 将插入。

标签: sql-server tsql transaction-log


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我需要一次分解为喜欢 docSVsys1.sID 并需要按 docSVsys1.sID、docSVsys2.sID 的顺序依次插入,否则我将分段。我可以在 .NET 中循环。
  • 好的,您可以在 .NET 中执行此操作,也可以在 TSQL 中使用游标。
【解决方案2】:

正如@usr 所指出的,这只是太多的数据。应该事先算好。一个大数字的平方是一个非常大的数字。这更适用于 Azure 表存储。这似乎有效。给Filip支票。

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;

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 2011-05-10
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多