AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 54810
Accepted
Fabricio Araujo
Fabricio Araujo
Asked: 2013-12-11 15:01:35 +0800 CST2013-12-11 15:01:35 +0800 CST 2013-12-11 15:01:35 +0800 CST

SQL Server 配置文件跟踪中的列的解释

  • 772

在 Profiler 生成的跟踪表中,我尝试使用连接到 sys.allocation_units 的列 ObjectID2 来确定锁的来源。

结果并不好。它标识了许多不在生成跟踪的查询上的表。

谁知道那一栏是什么意思?我的 Google-fu 今天让我失望了。

我用来查找对象的基本查询(最后一个没有au.*, p.* 部分):

select object_name(p.object_id) AS name, tt.RowNumber, au.*, p.* 
from 
  Trc_Tables_20131210 tt
  INNER JOIN sys.allocation_units au
    ON tt.ObjectID2 = au.allocation_unit_id  AND tt.ObjectID = 0
  INNER JOIN sys.partitions p
    ON au.container_id = p.hobt_id

WHERE au.type IN (1,3) AND tt.EventClass = 24

编辑:系统健康是学习的一个很好的迹象。但是现在我必须限制自己使用 SQL 分析器跟踪表来研究查询的锁定,因为我无法轻松访问客户的生产服务器。
关于trace:trace中的主要事件是Lock:Acquired。

sql-server sql-server-2008-r2
  • 1 1 个回答
  • 1985 Views

1 个回答

  • Voted
  1. Best Answer
    user507
    2013-12-11T19:05:48+08:002013-12-11T19:05:48+08:00

    对象 ID 实际上是一个分区 ID。这个关于 SO 的问题提供了一个简单的查询来检索所需的信息。

    附带说明一下,由于您使用的是 SQL Server 2008 R2,因此我强烈建议您查看包含最近发生的死锁等内容的系统健康会话。根据您的实例的活动,您可能需要按计划提取此信息,因为它是缓冲内存,因此不会在那里停留很长时间。提取此信息比尝试设置跟踪并等待它再次出现要有效得多。

    我实际上写了一篇关于这个领域的博客文章,其中包括一个脚本来解析出更易读的信息。博客文章在这里,脚本如下:

    
    ;WITH xDeadlock (Contents)
    AS
    (
    select CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') as xml) as DeadlockGraph
    FROM
        (select CAST(target_data as xml) as TargetData
        from sys.dm_xe_session_targets st
        join sys.dm_xe_sessions s on s.address = st.event_session_address
        where name = 'system_health') AS Data
    CROSS APPLY TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent)
    ), Victims AS
    (
    SELECT    ID = Victims.List.value('@id', 'varchar(50)')
    FROM xDeadlock
    CROSS APPLY xDeadlock.Contents.nodes('//deadlock/victim-list/victimProcess') AS Victims (List)
    ), Locks AS
    (
    SELECT  --xDeadlock.DeadlockID,
            MainLock.Process.value('@id', 'varchar(100)') AS LockID,
            OwnerList.Owner.value('@id', 'varchar(200)') AS LockProcessId,
            REPLACE(MainLock.Process.value('local-name(.)', 'varchar(100)'), 'lock', '') AS LockEvent,
            MainLock.Process.value('@objectname', 'sysname') AS ObjectName,
            OwnerList.Owner.value('@mode', 'varchar(10)') AS LockMode,
            MainLock.Process.value('@dbid', 'INTEGER') AS Database_id,
            MainLock.Process.value('@associatedObjectId', 'BIGINT') AS AssociatedObjectId,
            MainLock.Process.value('@WaitType', 'varchar(100)') AS WaitType,
            WaiterList.Owner.value('@id', 'varchar(200)') AS WaitProcessId,
            WaiterList.Owner.value('@mode', 'varchar(10)') AS WaitMode
    FROM    xDeadlock
            CROSS APPLY xDeadlock.Contents.nodes('//deadlock/resource-list') AS Locks (list)
            CROSS APPLY Locks.List.nodes('*') AS MainLock (Process)
            CROSS APPLY MainLock.Process.nodes('owner-list/owner') AS OwnerList (Owner)
            CROSS APPLY MainLock.Process.nodes('waiter-list/waiter') AS WaiterList (Owner)
    ), Process AS 
    (
    -- get the data from the process node
    SELECT  --xDeadlock.DeadlockID,
            [Victim] = CONVERT(BIT, CASE WHEN Deadlock.Process.value('@id', 'varchar(50)') = ISNULL(Deadlock.Process.value('../../@victim', 'varchar(50)'), v.ID) 
                                         THEN 1
                                         ELSE 0
                                    END),
            [LockMode] = Deadlock.Process.value('@lockMode', 'varchar(10)'), -- how is this different from in the resource-list section?
            [ProcessID] = Process.ID, --Deadlock.Process.value('@id', 'varchar(50)'),
            [KPID] = Deadlock.Process.value('@kpid', 'int'), -- kernel-process id / thread ID number
            [SPID] = Deadlock.Process.value('@spid', 'int'), -- system process id (connection to sql)
            [SBID] = Deadlock.Process.value('@sbid', 'int'), -- system batch id / request_id (a query that a SPID is running)
            [ECID] = Deadlock.Process.value('@ecid', 'int'), -- execution context ID (a worker thread running part of a query)
            [IsolationLevel] = Deadlock.Process.value('@isolationlevel', 'varchar(200)'),
            [WaitResource] = Deadlock.Process.value('@waitresource', 'varchar(200)'),
            [LogUsed] = Deadlock.Process.value('@logused', 'int'),
            [ClientApp] = Deadlock.Process.value('@clientapp', 'varchar(100)'),
            [HostName] = Deadlock.Process.value('@hostname', 'varchar(20)'),
            [LoginName] = Deadlock.Process.value('@loginname', 'varchar(20)'),
            [TransactionTime] = Deadlock.Process.value('@lasttranstarted', 'datetime'),
            [BatchStarted] = Deadlock.Process.value('@lastbatchstarted', 'datetime'),
            [BatchCompleted] = Deadlock.Process.value('@lastbatchcompleted', 'datetime'),
            [InputBuffer] = Input.Buffer.query('.'),
            xDeadlock.[Contents],
            [QueryStatement] = Execution.Frame.value('.', 'varchar(max)'),
            TranCount = Deadlock.Process.value('@trancount', 'int')
    FROM    xDeadlock
            CROSS APPLY xDeadlock.Contents.nodes('//deadlock/process-list/process') AS Deadlock (Process)
            CROSS APPLY (SELECT Deadlock.Process.value('@id', 'varchar(50)') ) AS Process (ID)
            LEFT JOIN Victims v ON Process.ID = v.ID
            CROSS APPLY Deadlock.Process.nodes('inputbuf') AS Input (Buffer)
            CROSS APPLY Deadlock.Process.nodes('executionStack') AS Execution (Frame)
    )
    -- get the columns in the desired order
    SELECT  p.Victim,
            p.LockMode,
            LockedObject = NULLIF(l.ObjectName, ''),
            l.database_id,
            l.AssociatedObjectId,
            LockProcess = p.ProcessID,
            p.KPID,
            p.SPID,
            p.SBID,
            p.ECID,
            p.TranCount,
            l.LockEvent,
            LockedMode = l.LockMode,
            l.WaitProcessID,
            l.WaitMode,
            p.WaitResource,
            l.WaitType,
            p.IsolationLevel,
            p.LogUsed,
            p.ClientApp,
            p.HostName,
            p.LoginName,
            p.TransactionTime,
            p.BatchStarted,
            p.BatchCompleted,
            p.InputBuffer
    FROM    
        Locks l
        JOIN Process p ON p.ProcessID = l.LockProcessID
    --WHERE p.TransactionTime > '2013-10-01'
    ORDER BY p.Victim DESC,
            p.ProcessId;
    
    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve