如何在大插入期间最小化日志记录?

Jac*_*las 6 sql-server-2008 logs

在夜间计划任务期间,我使用select into然后添加聚集索引从头开始创建一个大表。我想在整个过程中最大限度地减少日志记录量,因为我用于日志备份传送的带宽有限。

如果有帮助,我很乐意考虑另一种方法。

JNK*_*JNK 9

根据我的经验,最好的方法是:

  • 创建 EMPTY 表
  • 创建聚集索引(匹配您的源表)
  • INSERT使用TABLOCK提示进行最少日志记录

详细信息包含在此 MS 白皮书中。

首先创建表,然后在与源相同的键上对其进行索引,从而消除了排序。

如果键匹配,TABLOCK使用,并启用跟踪标志 610,操作将被最少记录(记录页面而不是事务或行)。

对我来说,这更快,因为在SELECT INTO强制排序之后添加聚集索引可能非常昂贵且耗时。

编辑:

TF 610 仅用于控制插入索引表时的最小日志记录行为。

我不知道使用它有任何问题,但 MS 建议(我认为是防御性的)在使用前进行测试。


Mar*_*ith 5

有没有一种简单的方法来衡量一个事务产生多少日志,以便我可以定量比较方法?

简单的方法,您可以在批处理之前和之后从 dm_io_virtual_file_stats DMV 记录当前日志使用情况。但是,这会受到其他服务器活动的污染,因此只有在您可以单独测试时才有用。

SELECT
    DB_NAME(DB_ID()) AS [Database Name]
  , vs.[file_id]
  , vs.num_of_reads
  , vs.num_of_bytes_read
  , vs.num_of_writes
  , vs.num_of_bytes_written
FROM
    sys.database_files f
INNER JOIN  
    sys.dm_io_virtual_file_stats(DB_ID(), NULL) vs
ON  vs.file_id = f.file_id
WHERE
    f.type_desc = 'LOG'
OPTION
    (RECOMPILE) ;
Run Code Online (Sandbox Code Playgroud)

更好的任务工具是sp_whoisactive,如果@get_transaction_info设置了参数,它会报告每个事务日志的统计信息。