1

我有一个查询要我获取有关事务日志 ( .ldf) 文件的一些基本信息。这里是:

WITH CTE AS
(
    SELECT
        AllocUnitName,
        Operation,
        Context,
        [Lock Information],
        SUM(CONVERT(BIGINT, [Log Record Length])) AS TotalTranLogBytes,
        SUM(CONVERT(BIGINT, [Log Record Length])) * 100 /
            SUM(CONVERT(MONEY, SUM(CONVERT(BIGINT, [Log Record Length]))))
            OVER() AS PercentOfLog
    FROM
        sys.fn_dblog(NULL,NULL)
    GROUP BY
        AllocUnitName,
        Operation,
        Context,
        [Lock Information]
)

SELECT
    AllocUnitName,
    Operation,
    Context,
    [Lock Information],
    TotalTranLogBytes,
    PercentOfLog
FROM
    CTE
WHERE
    PercentOfLog >= 0
ORDER BY
    TotalTranLogBytes DESC

不幸的是,我实际上并不理解输出......我主要关心的是查询结果中的最上面一行,它是事务日志中使用的最大空间量,很简单!

但是,还有其他列AllocUnitNameOperationContext。就我而言,我得到:

dbo.MyMassiveTable.PK_MyMassiveTable    LOP_MODIFY_ROW  LCX_TEXT_MIX        3848564 61.6838

...作为我的输出。但是在 EARTH 上LOP_MODIFY_ROWLCX_TEXT_MIX实际上是什么意思?

显然我可以模糊地理解它与该表的主键有关,它与 UPDATE 命令相关联,并且文本列发生了一些事情?

但我需要精确!

任何可以帮助我理解为什么事务日志的这个特定部分如此庞大的人都会有很大的帮助!

4

1 回答 1

2

这表明该表包含某个大对象数据类型的列,该数据类型受到插入或更新活动的影响(即MAX数据类型XML、、CLR 数据类型或IMAGE[N]Text)。

dbo.MyMassiveTable.PK_MyMassiveTable必须是聚集索引或INCLUDE-s 一个或多个 LOB 列的非聚集索引。

LCX_TEXT_MIX大概表示文本混合页面:

一个文本页面,包含小块 LOB 值以及文本树的内部部分。这些可以在索引或堆的同一分区中的 LOB 值之间共享。

LOP_MODIFY_ROW通常在更新值时出现在日志中,但下面的示例显示 insert 也可以重现相同的日志记录结果。

CREATE TABLE dbo.MyMassiveTable
  (
     pk    INT IDENTITY CONSTRAINT PK_MyMassiveTable PRIMARY KEY,
     Blob1 NVARCHAR(MAX)
  )

INSERT INTO dbo.MyMassiveTable
VALUES     (REPLICATE(CAST(N'X' AS VARCHAR(MAX)), 3848564 / 2)); 
于 2015-10-27T20:19:52.777 回答