楼主: Cherish_j_wang

[精华] MSSQL DBA 精华总结[处理对象名称中特殊字符]

[复制链接]
论坛徽章:
22
2010新春纪念徽章
日期:2010-03-01 11:06:29福特
日期:2013-11-06 19:08:01保时捷
日期:2013-11-15 07:54:26问答徽章
日期:2013-11-24 20:31:08马上有对象
日期:2014-03-20 13:07:43itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:48:162015年新春福章
日期:2015-03-06 11:57:31摩羯座
日期:2015-10-12 10:03:31蒙奇·D·路飞
日期:2017-06-19 23:56:57
21#
发表于 2012-3-10 19:53 | 只看该作者
收藏,备用。

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
22#
 楼主| 发表于 2012-3-10 20:37 | 只看该作者
周应侯 发表于 2012-3-10 13:09
这个也有bug~

能不能请您指出来,方便我修正。谢谢

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
23#
 楼主| 发表于 2012-3-10 21:19 | 只看该作者
本帖最后由 Cherish_j_wang 于 2012-3-10 21:20 编辑

MSSQL DBA 常用脚本总结
之查看MSSQL Block进程关系
场景
MSSQL DBA日常工作过程中,经常会遇到服务器上某一个简单的查询非常缓慢,作为DBA的职业敏感性,首先应该想到是:该进程是否被其他进程Block住?那么,我们需要搞清楚以下问题:
1.       执行进程被哪一个进程Block住?
2.       这个进程执行的是神马语句块或者存储过程?
3.       该语句块(或者存储过程)执行到那条语句?
4.       Block进程之间的关系(有的时候会存在很多进程的Block,我们需要搞清楚谁阻塞了谁?),找到BlockRoot

脚本
带着这个问题,我们写下了下面的语句: Block_Query_V2.sql (3.65 KB, 下载次数: 284)

  1. USE Master
  2. GO

  3. declare
  4. @spid int
  5. ;

  6. select
  7. @spid = null--null:all
  8. ;

  9. ;WITH DATA(spid,blockRelationship,blocked,spidLevel,hostname,program_name,loginame,login_time,BlockDuration,Status,sqlText,Memo,stmt_start,stmt_end,db_Name)
  10. AS(
  11. SELECT spid
  12. ,CONVERT(VARCHAR(256),' ') AS blockRelationship
  13. ,blocked
  14. ,spidLevel = 1
  15. ,hostname
  16. ,program_name
  17. ,loginame
  18. ,A.login_time
  19. ,DATEDIFF(MINUTE,A.login_time,GETDATE()) AS BlockDuration
  20. ,A.Status
  21. ,B.text
  22. ,Memo = CONVERT (varchar(128), 'BlockRoot')
  23. ,A.stmt_start
  24. ,A.stmt_end
  25. ,db_name(A.dbid) AS db_Name
  26. FROM sys.sysprocesses AS A WITH (NOLOCK)
  27. CROSS APPLY sys.dm_exec_sql_text(A.sql_handle) AS B
  28. WHERE Blocked = 0
  29. UNION ALL
  30. SELECT
  31. A.spid
  32. ,CONVERT(varchar(128),REPLICATE('L' ,B.spidLevel)) + CONVERT (varchar(128), A.blocked) AS Sort
  33. ,A.blocked
  34. ,spidLevel+1
  35. ,A.hostname
  36. ,A.program_name
  37. ,A.loginame
  38. ,A.login_time
  39. ,DATEDIFF(MINUTE,A.login_time,GETDATE()) AS BlockDuration
  40. ,A.Status
  41. ,C.text
  42. ,Memo = 'Blocked by ' + CONVERT (varchar(117), A.blocked)
  43. ,A.stmt_start
  44. ,A.stmt_end
  45. ,db_name(A.dbid) AS db_Name
  46. FROM sys.sysprocesses AS A WITH (NOLOCK)
  47. INNER JOIN DATA AS B
  48. ON A.blocked = B.spid
  49. CROSS APPLY sys.dm_exec_sql_text(A.sql_handle) AS C
  50. --WHERE B.blocked = 0
  51. )
  52. SELECT spid
  53. ,blockRelationship
  54. ,blocked
  55. ,login_time
  56. ,GETDATE() AS [current_time]
  57. ,sql_statement = (SELECT TOP 1 SUBSTRING(sqlText,stmt_start / 2+1 ,
  58. (
  59. (
  60. CASE WHEN stmt_end = -1 THEN (LEN(CONVERT(nvarchar(max),sqlText)) * 2)
  61. ELSE stmt_end END
  62. ) - stmt_start) / 2+1
  63. )
  64. )
  65. ,db_Name
  66. ,spidLevel
  67. ,hostname
  68. ,loginame
  69. ,program_name
  70. --,login_time
  71. ,BlockDuration
  72. ,status
  73. ,sqlText
  74. ,Memo
  75. FROM DATA
  76. --the block root spid
  77. WHERE spidLevel = 1
  78. AND spID IN(
  79. SELECT blocked
  80. FROM DATA
  81. )
  82. UNION ALL
  83. SELECT spid
  84. ,blockRelationship
  85. ,blocked
  86. ,login_time
  87. ,GETDATE()
  88. ,sql_statement = (SELECT TOP 1 SUBSTRING(sqlText,stmt_start / 2+1 ,
  89. (
  90. (
  91. CASE WHEN stmt_end = -1 THEN (LEN(CONVERT(nvarchar(max),sqlText)) * 2)
  92. ELSE stmt_end END
  93. ) - stmt_start) / 2+1
  94. )
  95. )
  96. ,db_Name
  97. ,spidLevel
  98. ,hostname
  99. ,loginame
  100. ,program_name
  101. --,login_time
  102. ,BlockDuration
  103. ,status
  104. ,sqlText
  105. ,Memo
  106. FROM DATA
  107. WHERE spidLevel > 1

  108. IF @spid is not null

  109. SELECT
  110. database_name = DB_NAME(s1.dbid)
  111. ,sql_statement = (SELECT TOP 1 SUBSTRING(s2.text,stmt_start / 2+1 ,
  112. (
  113. (
  114. CASE WHEN stmt_end = -1 THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)
  115. ELSE stmt_end END
  116. ) - stmt_start) / 2+1
  117. )
  118. )
  119. ,s2.text
  120. ,Duration_min = DATEDIFF(MINUTE,s1.login_time,GETDATE())
  121. ,s1.hostname
  122. ,s1.status
  123. FROM sys.sysprocesses AS s1 WITH(NOLOCK)
  124. CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
  125. WHERE s1.spid = @spid;
复制代码
脚本说明:
该脚本有一个输入参数(默认为null)@spid,表示我们需要查看的SPid执行的语句情况,如果不输入,则只查看Block情况。

测试
1.       我们打开SSMS,开启一个连接,执行下面的语句(比如SPID54):


  1. if OBJECT_ID('tempdb.dbo.##temp','u') is not null
  2. drop table ##temp
  3. GO

  4. begin tran
  5. select *
  6. into ##temp
  7. from sys.tables
复制代码

2.       带一执行完毕后,我们再打开另外一个连接,执行下面的语句(比如SPID57
  1. select * from ##temp
复制代码

3.       步骤2中的进程会一致处于执行状态,让我们开启第三个连接,执行上面查看Block关系的脚本
显示结果如下:
不设置如输入参数:

将输入参数设置为54

说明当然大家也可以使用SP_who2稍加改造来查看Block情况,脚本如下: sp_who2.sql (860 Bytes, 下载次数: 60)
  1. use master
  2. go
  3. declare @t table
  4. (
  5. spid int
  6. ,status nchar(30)
  7. ,login nchar(128)
  8. ,HostName nchar(128)
  9. ,BlockBy char(5)
  10. ,DbName nchar(128)
  11. ,Command nchar(16)
  12. ,CpuTime int
  13. ,DiskIO int
  14. ,LastBatch varchar(16)
  15. ,ProgramName nchar(128)
  16. ,Spid2 int
  17. ,request_id int
  18. )

  19. INSERT INTO @t
  20. EXEC sp_who2


  21. IF OBJECT_ID('tempdb.dbo.#temp') IS NOT NULL
  22. DROP TABLE #temp

  23. CREATE TABLE #temp
  24. (
  25. BlockBy INT NULL
  26. );

  27. INSERT INTO #temp
  28. SELECT BlockBy
  29. FROM @t
  30. WHERE LTRIM(BlockBy)<>'.'

  31. select B.Text
  32. ,A.hostName
  33. ,A.program_name
  34. ,A.loginame
  35. ,db_name(a.dbid) AS DbName
  36. ,A.status
  37. ,A.spid
  38. ,A.blocked
  39. ,A.*,B.*
  40. from sys.sysprocesses AS A
  41. cross apply sys.dm_exec_sql_text(A.sql_handle) aS B
  42. WHERE A.Spid IN(
  43. SELECT BlockBy
  44. FROM #temp
  45. UNION ALL
  46. SELECT spid
  47. FROM @t
  48. WHERE LTRIM(BlockBy)<>'.'
  49. )
复制代码

显示结果如下

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
24#
 楼主| 发表于 2012-3-10 21:26 | 只看该作者
mikean 发表于 2012-3-10 19:53
收藏,备用。

没啥人气啊~~~都是分享了不少了~

使用道具 举报

回复
论坛徽章:
1
迷宫蛋
日期:2012-03-14 10:52:54
25#
发表于 2012-3-10 22:18 | 只看该作者
楼主很强大。对我们这些初学者来说。非常值得学习。我支持你。会一直关注的。

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
26#
 楼主| 发表于 2012-3-10 22:22 | 只看该作者
lg0812 发表于 2012-3-10 22:18
楼主很强大。对我们这些初学者来说。非常值得学习。我支持你。会一直关注的。

谢谢您~~您们的关注,是我不断写贴最大的动力

使用道具 举报

回复
论坛徽章:
1
迷宫蛋
日期:2012-03-14 10:52:54
27#
发表于 2012-3-10 22:27 | 只看该作者
Cherish_j_wang 发表于 2012-3-10 22:22
谢谢您~~您们的关注,是我不断写贴最大的动力

要谢谢您的无私分享。也是我们这些初学者不断学习的东西。

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
28#
 楼主| 发表于 2012-3-10 22:48 | 只看该作者
lg0812 发表于 2012-3-10 22:27
要谢谢您的无私分享。也是我们这些初学者不断学习的东西。

好嘛,那就经常来看看吧。如果有时间,我几乎每天都会分享一二~~~多多的提意见才好~

使用道具 举报

回复
论坛徽章:
2
茶鸡蛋
日期:2012-05-29 09:41:36奥运会纪念徽章:棒球
日期:2012-09-13 14:44:37
29#
发表于 2012-3-11 01:55 | 只看该作者
mark

使用道具 举报

回复
论坛徽章:
1
迷宫蛋
日期:2012-03-14 10:52:54
30#
发表于 2012-3-11 07:43 | 只看该作者
Cherish_j_wang 发表于 2012-3-10 22:48
好嘛,那就经常来看看吧。如果有时间,我几乎每天都会分享一二~~~多多的提意见才好~

抱歉,打错字了。是动力,不是东西。哈哈哈

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表