扩展事件 lock_escalation resource_type 字段中的 HOBT 与 OBJECT

sam*_*hop 5 sql-server extended-events sql-server-2014

我正在lock_escalation我们的生产服务器(运行 SQL Server 2014 企业版)上捕获事件,并试图理解输出,尤其是该resource_type字段。尽管该resource_type字段有 17 个不同的可能值,但我看到的只是OBJECTHOBT。在某些服务器上我只看到OBJECT,但在一个服务器上我看到HOBT了很多。

SQL Server 试图通过该字段告诉我什么?我们所有服务器上的所有表当前都配置了LOCK_ESCALATION = TABLE,我们正在考虑更改。我HOBT经常看到的服务器比我们的其他服务器有更多的分区表,但是,根据我的理解和我们的配置,SQL Server 应该只升级到表级别而不是分区级别。

我很确定我们所有的表都配置了LOCK_ESCALATION = TABLE. 我在数据库中运行了这个查询,在那里我看到了很多HOBT结果:

SELECT lock_escalation_desc, total = COUNT(*)
    FROM sys.tables
    GROUP BY lock_escalation_desc
Run Code Online (Sandbox Code Playgroud)

我得到了一行:

lock_escalation_desc  total
TABLE                 143
Run Code Online (Sandbox Code Playgroud)

(那个特定的数据库非常庞大,它基本上拥有自己的服务器。)


编辑:我现在很确定这OBJECT表示表锁定并HOBT表示分区级锁定。但是我很惊讶地看到分区级锁定,因为所涉及的表没有配置为以这种方式锁定,而且我读到的所有内容都表明 SQL Server 应该在表级锁定

以下是其中一个事件的完整 XML:

<event name="lock_escalation" package="sqlserver" timestamp="2017-06-08T18:00:23.590Z">
  <data name="resource_type">
    <type name="lock_resource_type" package="sqlserver"></type>
    <value>12</value>
    <text><![CDATA[HOBT]]></text>
  </data>
  <data name="mode">
    <type name="lock_mode" package="sqlserver"></type>
    <value>5</value>
    <text><![CDATA[X]]></text>
  </data>
  <data name="owner_type">
    <type name="lock_owner_type" package="sqlserver"></type>
    <value>1</value>
    <text><![CDATA[Transaction]]></text>
  </data>
  <data name="transaction_id">
    <type name="int64" package="package0"></type>
    <value>10067714031</value>
  </data>
  <data name="database_id">
    <type name="uint32" package="package0"></type>
    <value>8</value>
  </data>
  <data name="lockspace_workspace_id">
    <type name="ptr" package="package0"></type>
    <value>0x0000004e491a1e50</value>
  </data>
  <data name="lockspace_sub_id">
    <type name="uint32" package="package0"></type>
    <value>4</value>
  </data>
  <data name="lockspace_nest_id">
    <type name="uint32" package="package0"></type>
    <value>1</value>
  </data>
  <data name="resource_0">
    <type name="uint32" package="package0"></type>
    <value>38609</value>
  </data>
  <data name="resource_1">
    <type name="uint32" package="package0"></type>
    <value>256</value>
  </data>
  <data name="resource_2">
    <type name="uint32" package="package0"></type>
    <value>0</value>
  </data>
  <data name="escalation_cause">
    <type name="lock_escalation_cause" package="sqlserver"></type>
    <value>0</value>
    <text><![CDATA[Lock threshold]]></text>
  </data>
  <data name="object_id">
    <type name="int32" package="package0"></type>
    <value>1052582838</value>
  </data>
  <data name="hobt_id">
    <type name="uint64" package="package0"></type>
    <value>72057596568207360</value>
  </data>
  <data name="escalated_lock_count">
    <type name="uint32" package="package0"></type>
    <value>6248</value>
  </data>
  <data name="hobt_lock_count">
    <type name="uint32" package="package0"></type>
    <value>6247</value>
  </data>
  <data name="statement">
    <type name="unicode_string" package="package0"></type>
    <value><![CDATA[(@accountId int, @date int, @basisId int)DELETE FROM StatFxLotCumulativeActivity WHERE accountId = @accountId AND reportDate > @date]]></value>
  </data>
  <data name="database_name">
    <type name="unicode_string" package="package0"></type>
    <value><![CDATA[aws_db]]></value>
  </data>
</event>
Run Code Online (Sandbox Code Playgroud)

当我查询该事件中引用的object_id/hobt_id对的系统视图时:

select * from sys.tables where object_id = 1052582838
select * from sys.partitions where hobt_id = 72057596568207360
Run Code Online (Sandbox Code Playgroud)

我似乎很清楚所涉及的表是分区的并且有一个聚集索引:

name                        object_id  principal_id schema_id parent_object_id type type_desc  create_date             modify_date             is_ms_shipped is_published is_schema_published lob_data_space_id filestream_data_space_id max_column_id_used lock_on_bulk_load uses_ansi_nulls is_replicated has_replication_filter is_merge_published is_sync_tran_subscribed has_unchecked_assembly_data text_in_row_limit large_value_types_out_of_row is_tracked_by_cdc lock_escalation lock_escalation_desc is_filetable is_memory_optimized durability durability_desc
--------------------------- ---------- ------------ --------- ---------------- ---- ---------- ----------------------- ----------------------- ------------- ------------ ------------------- ----------------- ------------------------ ------------------ ----------------- --------------- ------------- ---------------------- ------------------ ----------------------- --------------------------- ----------------- ---------------------------- ----------------- --------------- -------------------- ------------ ------------------- ---------- ---------------
StatFxLotCumulativeActivity 1052582838 NULL         1         0                U    USER_TABLE 2015-02-19 10:24:19.463 2017-02-21 14:06:03.857 0             0            0                   0                 NULL                     10                 0                 1               0             0                      0                  0                       0                           0                 0                            0                 0               TABLE                0            0                   0          SCHEMA_AND_DATA

partition_id      object_id  index_id partition_number hobt_id           rows      filestream_filegroup_id data_compression data_compression_desc
----------------- ---------- -------- ---------------- ----------------- --------- ----------------------- ---------------- ---------------------
72057596568207360 1052582838 1        32               72057596568207360 982143818 0                       2                PAGE
Run Code Online (Sandbox Code Playgroud)

该表有 126 个分区,但只有 13 个分区有任何行。运行此查询:

select * from sys.partitions where object_id = 1052582838 and rows > 0
Run Code Online (Sandbox Code Playgroud)

给我这个:

partition_number hobt_id              rows
---------------- -------------------- --------------------
18               72057596141502464    34861
21               72057596141699072    89201
22               72057596141764608    573135
23               72057596141830144    471881
24               72057596141895680    1776464
26               72057596142026752    9463538
25               72057596299771904    1454117
27               72057596359606272    3748776
28               72057596360327168    2650215
29               72057596361048064    2700981
30               72057596361179136    448102594
31               72057596361310208    1375155391
32               72057596568207360    998318651
Run Code Online (Sandbox Code Playgroud)

这是表的 SSMS 生成的 DDL:

CREATE TABLE [dbo].[StatLotCumulativeActivity](
    [accountId] [int] NOT NULL,
    [reportDate] [int] NOT NULL,
    [awsId] [int] NOT NULL,
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [value] [bigint] NOT NULL,
    [activityType] [int] NOT NULL,
    [balanceId] [int] NOT NULL,
    [sourceOriginalTransactionId] [int] NULL,
    [basisId] [int] NOT NULL,
    [sourceSecurityId] [int] NULL,
 CONSTRAINT [PK_dbo_StatLotCumulativeActivity] PRIMARY KEY CLUSTERED 
(
    [accountId] ASC,
    [reportDate] ASC,
    [awsId] ASC,
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
Run Code Online (Sandbox Code Playgroud)

Sol*_*zky 4

你不需要猜测这一点。根据sys.dm_tran_locks的文档(在“资源详细信息”下),它表明:

霍比特

方法:

代表堆或B树。这些是基本的访问路径结构。

并且“resource_linked_entity_id”字段(应该存在或应该添加)值涉及:

霍比特 ID。该值对应于sys.partitions.hobt_id

意思是,将“resource_linked_entity_id”值插入:

-- run this in the DB where the object exists
SELECT OBJECT_SCHEMA_NAME(sp.[object_id]) AS [SchemaName],
       OBJECT_NAME(sp.[object_id]) AS [ObjectName],
       si.[name] AS [IndexName],
       *
FROM   sys.partitions sp
INNER JOIN sys.indexes si
        ON si.[object_id] = sp.[object_id]
       AND si.[index_id] = sp.[index_id]
WHERE  sp.[hobt_id] = <reported_hobt_id>;
Run Code Online (Sandbox Code Playgroud)

一些额外的资源: