web-dev-qa-db-ja.com

拡張イベントのlock_escalation resource_typeフィールドのHOBTとOBJECT

実稼働サーバー(SQL Server 2014のEnterprise Editionを実行)でlock_escalationイベントをキャプチャして、出力、特にresource_typeフィールドを理解しようとしています。 resource_typeフィールドには17の可能な値がありますが、私が見るのはOBJECTHOBTだけです。一部のサーバーでは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)
)
5
sam.bishop

これを推測する必要はありません。 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>;

追加のリソース:

3
Solomon Rutzky