実稼働サーバー(SQL Server 2014のEnterprise Editionを実行)でlock_escalation
イベントをキャプチャして、出力、特にresource_type
フィールドを理解しようとしています。 resource_type
フィールドには17の可能な値がありますが、私が見るのはOBJECT
とHOBT
だけです。一部のサーバーではOBJECT
しか表示されませんが、1つのサーバーではHOBT
がかなり多く表示されます。
SQL Serverはそのフィールドで何を教えようとしているのですか?すべてのサーバー上のすべてのテーブルは現在LOCK_ESCALATION = TABLE
で構成されており、変更を検討しています。 HOBT
が表示されるサーバーには、他のサーバーよりもパーティションテーブルが多いことがよくありますが、SQLサーバーは、パーティションレベルではなく、テーブルレベルにしかエスカレートしないようにしています。 。
すべてのテーブルがLOCK_ESCALATION = TABLE
で構成されていることは確かです。非常に多くのHOBT
結果が表示されるデータベースでこのクエリを実行しました。
SELECT lock_escalation_desc, total = COUNT(*)
FROM sys.tables
GROUP BY lock_escalation_desc
そして、私は1行を得ました:
lock_escalation_desc total
TABLE 143
(その特定のデータベースは非常に巨大なので、基本的に独自のサーバーを取得します。)
編集:OBJECT
がテーブルロックを示し、HOBT
がパーティションレベルのロックを示すことは、今やかなり確信しています。しかし、関係するテーブルがそのようにロックされるように構成されていないため、パーティションレベルのロックを確認して非常に驚いています SQL Serverがテーブルレベルでロックする必要があることを私が読んだすべてが示しています 。
以下は、イベントの1つの完全な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>
そのイベントで参照されているobject_id
/hobt_id
ペアについてシステムビューをクエリすると、次のようになります。
select * from sys.tables where object_id = 1052582838
select * from sys.partitions where hobt_id = 72057596568207360
関連するテーブルがパーティション化されており、クラスター化インデックスがあることは私には明らかなようです。
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
テーブルには126のパーティションがありますが、行があるのは13のみです。このクエリを実行する:
select * from sys.partitions where object_id = 1052582838 and rows > 0
これをくれ:
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
これは、テーブルの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)
)
これを推測する必要はありません。 sys.dm_tran_locks (「リソースの詳細」の下)のドキュメントによると、
ホブ
手段:
ヒープまたはBツリーを表します。これらは基本的なアクセスパス構造です。
「resource_associated_entity_id」フィールド(そこにあるか、追加する必要があります)の値は、次のものに関連しています。
HoBt ID。この値はsys.partitions.hobt_idに対応します。
つまり、「resource_associated_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>;
追加のリソース: