sam*_*hop 5 sql-server extended-events sql-server-2014
我正在lock_escalation
我们的生产服务器(运行 SQL Server 2014 企业版)上捕获事件,并试图理解输出,尤其是该resource_type
字段。尽管该resource_type
字段有 17 个不同的可能值,但我看到的只是OBJECT
和HOBT
。在某些服务器上我只看到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)
你不需要猜测这一点。根据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)
一些额外的资源:
归档时间: |
|
查看次数: |
4322 次 |
最近记录: |