SQL Server Extended Events使用2:查询使用锁最多的对象
2012-09-15 14:52
459 查看
当我们怀疑可能存在高度争用的资源,并希望了解这些对象占用多少锁定。一旦识别锁定频率最高的对象,便可采取一些措施来优化对争用对象的访问。使用SQL Server Extended Events可以帮助我们获得对象使用的锁资源。
--先删除LockCounts Event Session
IF EXISTS(SELECT*
FROM sys.server_event_sessionsWHEREname='LockCounts')
DROP EVENT
sessionLockCounts ON
SERVER
GO
DECLARE @dbid int
SELECT @dbid =db_id('AdventureWorks')
DECLARE @sql nvarchar(1024)
SET @sql =
'
CREATE eventsession LockCounts ON SERVER
ADD EVENTsqlserver.lock_acquired (WHERE database_id ='+CAST(@dbidAS
nvarchar)+')
ADD TARGETpackage0.synchronous_bucketizer (
SETfiltering_event_name=''sqlserver.lock_acquired'', source_type=0,source=''resource_0'')'
EXEC (@sql)
GO
ALTER EVENT
sessionLockCounts ON
SERVER
STATE=start
GO
--
-- Create asimple workload that takes locks.
--
USEAdventureWorks
GO
SELECT TOP 1
* FROM HumanResources.Department
GO
-- Bucketizingtarget output is available from the
--sys.dm_xe_session_targets dynamic management view in
-- XML format.
-- The followingquery joins the bucketizing target output with
-- sys.objectsto obtain the object names.
--
SELECT name,
object_id, lock_count
FROM
(SELECT objstats.value('.','bigint')AS
lobject_id,
objstats.value('@count','bigint')
AS lock_count
FROM (
SELECT CAST(xest.target_dataAS
XML)
LockData
FROM sys.dm_xe_session_targets xest
JOIN sys.dm_xe_sessions xesONxes.address=
xest.event_session_address
JOIN sys.server_event_sessions sesONxes.name
= ses.name
WHERE xest.target_name=
'synchronous_bucketizer'ANDxes.name
= 'LockCounts'
) Locks
CROSS APPLY LockData.nodes('//BucketizerTarget/Slot')AS
T(objstats)
)LockedObjects
INNER JOIN
sys.objects o
ONLockedObjects.lobject_id= o.object_id
WHERE o.type!=
'S' AND o.type=
'U'
ORDER BY lock_countdesc
GO
--
结果:
name object_id lock_count
-------------------------------
Department 805577908 2
(1 row(s) affected)
-- Stop theevent session.
--
ALTER EVENT
SESSIONLockCounts ON
SERVER
state=stop
GO
--Drop the eventsession
DROP EVENT
SESSIONLockCounts ON
SERVER
--先删除LockCounts Event Session
IF EXISTS(SELECT*
FROM sys.server_event_sessionsWHEREname='LockCounts')
DROP EVENT
sessionLockCounts ON
SERVER
GO
DECLARE @dbid int
SELECT @dbid =db_id('AdventureWorks')
DECLARE @sql nvarchar(1024)
SET @sql =
'
CREATE eventsession LockCounts ON SERVER
ADD EVENTsqlserver.lock_acquired (WHERE database_id ='+CAST(@dbidAS
nvarchar)+')
ADD TARGETpackage0.synchronous_bucketizer (
SETfiltering_event_name=''sqlserver.lock_acquired'', source_type=0,source=''resource_0'')'
EXEC (@sql)
GO
ALTER EVENT
sessionLockCounts ON
SERVER
STATE=start
GO
--
-- Create asimple workload that takes locks.
--
USEAdventureWorks
GO
SELECT TOP 1
* FROM HumanResources.Department
GO
-- Bucketizingtarget output is available from the
--sys.dm_xe_session_targets dynamic management view in
-- XML format.
-- The followingquery joins the bucketizing target output with
-- sys.objectsto obtain the object names.
--
SELECT name,
object_id, lock_count
FROM
(SELECT objstats.value('.','bigint')AS
lobject_id,
objstats.value('@count','bigint')
AS lock_count
FROM (
SELECT CAST(xest.target_dataAS
XML)
LockData
FROM sys.dm_xe_session_targets xest
JOIN sys.dm_xe_sessions xesONxes.address=
xest.event_session_address
JOIN sys.server_event_sessions sesONxes.name
= ses.name
WHERE xest.target_name=
'synchronous_bucketizer'ANDxes.name
= 'LockCounts'
) Locks
CROSS APPLY LockData.nodes('//BucketizerTarget/Slot')AS
T(objstats)
)LockedObjects
INNER JOIN
sys.objects o
ONLockedObjects.lobject_id= o.object_id
WHERE o.type!=
'S' AND o.type=
'U'
ORDER BY lock_countdesc
GO
--
结果:
name object_id lock_count
-------------------------------
Department 805577908 2
(1 row(s) affected)
-- Stop theevent session.
--
ALTER EVENT
SESSIONLockCounts ON
SERVER
state=stop
GO
--Drop the eventsession
DROP EVENT
SESSIONLockCounts ON
SERVER
相关文章推荐
- SQL Server Extended Events使用1: 查询运行时间久的SQL语句
- SQL Server Extended Events 进阶 2:使用UI创建基本的事件会话
- SQL Server Extended Events 进阶 3:使用Extended Events UI
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- 【sql server inject】使用动态查询执行sql语句实例
- MOSS Search学习记录(十):MOSS Visual How To使用SharePoint Server 2007搜索对象模型编程创建搜索查询
- 在Windows Server 2008 R2 Server中,连接其他服务器的数据库遇到“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker ”
- 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
- 简要介绍SQL Server 2008新的事件处理系统—SQL Server Extended Events
- SQL-Server 存储过程查询速度,使用查询语句检测
- SQL Server Management Studio的对象资源管理器的使用
- 当对象包含嵌套对象时,使用Spark SQL执行sql查询抛出scala.MatchError异常
- 转摘--MS SQL Server 2000 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
- SQL Server数据查询之使用T-SQL查询数据
- 简要介绍SQL Server 2008新的事件处理系统—SQL Server Extended Events
- 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- 在SQL Server中使用Excel自动化对象(Automating Excel from SQL Server)
- 简要介绍SQL Server 2008新的事件处理系统——SQL Server Extended Events
- 简要介绍SQL Server 2008新的事件处理系统—SQL Server Extended Events