楼主: Cherish_j_wang

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

[复制链接]
论坛徽章:
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
11#
 楼主| 发表于 2012-3-7 21:17 | 只看该作者
~贝贝~ 发表于 2012-3-7 09:25
呵呵,支持原创哦,版主以及加精华了,本帖将推荐上明天的itpub门户社区推荐位置,本帖还可参与本月的精华中 ...

哈哈,送门票当然不错啦。~~~~大家顶起嘛。。。顶得多,分享得多哈

使用道具 举报

回复
论坛徽章:
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
12#
 楼主| 发表于 2012-3-7 21:24 | 只看该作者
不好意思,昨天晚上改帖子Bug的时候,导致附件没有上传成功,Download下来是空的sql文件,今天已经重新上传啦。~~

使用道具 举报

回复
论坛徽章:
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
13#
 楼主| 发表于 2012-3-7 21:42 | 只看该作者
本帖最后由 Cherish_j_wang 于 2012-3-8 22:06 编辑

MSSQL DBA 常用脚本总结
MSSQL查看磁盘使用信息
背景
DBA在工作中经常会遇到下面的需求:
在当前的系统中,我们的磁盘空间使用状况如何,需要回答如下问题
  • 当前Windows Server有哪些Driver
  • 每个Driver上总的空间大小是多少?
  • 使用了多少磁盘空间?
  • 剩余多少个percent
脚本
直接上脚本:
DiskSpace.sql (2.3 KB, 下载次数: 1445)
  1. USE master
  2. GO

  3. declare
  4. @drive sysname
  5. ;
  6. select
  7. @drive = NULL --null: all the drives
  8. ;

  9. if OBJECT_ID('tempdb.dbo.#Disk','u') is not null
  10. drop table #Disk

  11. CREATE TABLE #Disk
  12. (
  13. driver char(1)
  14. ,freespace nvarchar(255)
  15. ,totalspace nvarchar(255)
  16. ,freeprecent nvarchar(5)
  17. )
  18. DECLARE @TotalDisk TABLE
  19. (
  20. t nvarchar(100)
  21. )

  22. DECLARE
  23. @driver nvarchar(5)
  24. ,@totalsize nvarchar(50)
  25. ;
  26. INSERT INTO #Disk
  27. (
  28. driver
  29. ,freespace
  30. )
  31. EXEC master.sys.xp_fixeddrives

  32. --------============open xp_cmdshell
  33. IF EXISTS (
  34. SELECT TOP 1 *
  35. FROM sys.configurations WITH (NOLOCK)
  36. WHERE name='xp_cmdshell' and value=0)
  37. BEGIN
  38. EXEC master.dbo.sp_configure 'show advanced options', 1
  39. RECONFIGURE WITH OVERRIDE
  40. EXEC master.dbo.sp_configure 'xp_cmdshell', 1
  41. RECONFIGURE WITH OVERRIDE

  42. END
  43. --------============end open xp_cmdshell

  44. DECLARE disk_cur CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
  45. FOR
  46. SELECT
  47. driver
  48. FROM #Disk

  49. OPEN disk_cur
  50. FETCH NEXT FROM disk_cur INTO @driver

  51. WHILE @@FETCH_STATUS=0
  52. BEGIN
  53. INSERT INTO @TotalDisk
  54. EXEC('xp_cmdshell ''wmic LogicalDisk WHERE "Caption='''''+@driver+':''''" GET FreeSpace ,SIZE /VALUE''' )
  55. SELECT
  56. @totalsize=t
  57. FROM @TotalDisk
  58. WHERE
  59. t LIKE 'Size%'

  60. if(@totalsize is not null and LEN(@totalsize)>4)
  61. BEGIN
  62. SET @totalsize=REPLACE(SUBSTRING(@totalsize,CHARINDEX('=',@totalsize)+1,LEN(@totalsize)-CHARINDEX('=',@totalsize)-1),' ','')
  63. SET @totalsize=cast(cast(RTRIM(@totalsize) as bigint)/1024/1024 as nvarchar(50))

  64. UPDATE #Disk
  65. SET totalspace=@totalsize
  66. ,freeprecent=CAST(CAST(freespace AS bigint)*1.0/CAST(@totalsize AS bigint)*100 AS decimal(5,2))
  67. WHERE
  68. driver=@driver
  69. END

  70. FETCH NEXT FROM disk_cur INTO @driver
  71. END

  72. close disk_cur
  73. deallocate disk_cur

  74. ---==============query summary
  75. SELECT
  76. GETDATE() datetime
  77. ,driver
  78. ,[freespace(GB)] = cast(freespace as decimal(10,2))/1024.
  79. ,[totalspace(GB)] = cast(totalspace as decimal(10,2))/1024.
  80. ,[freeprecent(%)]= freeprecent
  81. FROM #Disk
  82. WHERE driver = ISNULL(@drive,driver);

  83. if OBJECT_ID('tempdb.dbo.#Disk','u') is not null
  84. drop table #Disk
  85. GO
复制代码
说明
下面是在我本机的测试结果:
datetime                driver freespace(GB)                           totalspace(GB)                          freeprecent(%)
----------------------- ------ --------------------------------------- --------------------------------------- --------------
2012-03-08 22:01:54.503 C      13.7343750                              29.2958984                              46.88
2012-03-08 22:01:54.503 D      112.6279296                             119.7490234                             94.05

使用道具 举报

回复
论坛徽章:
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
14#
 楼主| 发表于 2012-3-7 21:43 | 只看该作者
其实代码很简单,可能只是我们平时可能没有这么想过从数据库去获取Windows磁盘空间信息,因为我们已经习惯于是用Windows窗口来查看。~~~~

使用道具 举报

回复
论坛徽章:
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
15#
 楼主| 发表于 2012-3-8 20:25 | 只看该作者
hwtong 发表于 2012-3-5 22:21
还有更多的脚本吗?能一起发出来吗,我加为精华。
供大家学习,谢谢

@hwtong:
考虑到您的建议,将这个帖子做成DBA工作分享帖~

使用道具 举报

回复
论坛徽章:
26
ITPUB伯乐
日期:2012-05-22 15:05:35喜羊羊
日期:2015-05-14 12:15:30美羊羊
日期:2015-07-02 22:22:59秀才
日期:2015-08-24 09:51:48天枰座
日期:2015-11-05 16:53:35双鱼座
日期:2015-12-05 19:22:56巨蟹座
日期:2015-12-20 18:46:10摩羯座
日期:2016-05-19 09:54:17ITPUB15周年纪念
日期:2016-10-13 13:15:34秀才
日期:2017-02-22 15:16:26
16#
发表于 2012-3-8 20:40 | 只看该作者
Cherish_j_wang 发表于 2012-3-8 20:25
@hwtong:
考虑到您的建议,将这个帖子做成DBA工作分享帖~

好的 那样就更好了。希望能多多分享点东西给大家,让大家共同进步。
分享的多了,我是有奖励的哦

使用道具 举报

回复
论坛徽章:
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
17#
 楼主| 发表于 2012-3-8 21:47 | 只看该作者
本帖最后由 Cherish_j_wang 于 2012-3-8 21:51 编辑

MSSQL DBA 常用脚本总结
之更新所有数据库的用户表统计信息
背景
DBA在工作中经常会遇到下面的需求:
Action当前实例所有数据库的所有用户表(Action代表动作,比如:更新统计信息、重建索引或者是删除等,哈哈~~删除操作可千万不能在产品环境测试啊。~~)
带着这个问题,在此以“更新当前实例所有数据库的所有用户表统计信息”为例
脚本
直接上脚本:
  1. use master
  2. GO

  3. declare
  4. @sql nvarchar(max)
  5. ;

  6. set
  7. @sql = N'
  8. USE [?]
  9. RAISERROR(N''----------------------------------------------------------------
  10. Search on database: ?'', 10, 1) WITH NOWAIT

  11. Exec sys.sp_MSForEachTable N''
  12. Update Statistics * WITH FULLSCAN
  13. raiserror(''''on table:*'''',10,1)with nowait''
  14. ,@replacechar =N''*''
  15. ,@whereand=N''and o.name NOT LIKE ''''#%''''''
  16. '
  17. ;

  18. EXEC sys.sp_msforeachdb @sql,@replacechar=N'?'
复制代码
说明
这个脚本是将微软为公开的存储过程sp_MsForEachdbsp_MsForEachtable组合使用来解决问题,避免了使用游标或者循环数据库的方法。
其实这个脚本是一个通用的解决方法,只要涉及到“Action当前实例所有数据库的所有用户表”的需求,均可以使用该脚本来完成。

Update_Statistics_All_Table_OnAlldbs.sql

458 Bytes, 下载次数: 94

使用道具 举报

回复
论坛徽章:
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
18#
 楼主| 发表于 2012-3-9 20:50 | 只看该作者
本帖最后由 Cherish_j_wang 于 2012-3-9 20:59 编辑

MSSQL DBA 常用脚本总结
之利用Hashkey解决宽字段检索的性能问题
场景
就像你所知道的那样,宽字段(我们暂且将长度超过2000的字段)是不适合建立Index的,就算建立了IndexIO的消耗也不会少。那么,当我们不得不对超宽字段Search时(where col=constant),那么这种情况,我们如何来做优化呢?

优化思路
上面情形的优化灵感来自于Join中的Hash Join,我们是否可以建立一个Hash key字段,这个字段来自于宽字段的hash函数值,然后我们在该字段上建立Index。如此以来,我们就可以将常量的Hash值与表中的Hash值进行匹配,这样就可以大大提高查询效率。
根据这个优化思路,我们有多种方法来实现:
1.       使用Trigger来自动维护HashKey:这个太复杂,至少要实现更新和插入触发器
2.       使用计算列的方式来自动维护HashKey:这个比较简单
3.       开发人员手动维护这个HashKey(也就是在UpdateInsert宽字段的时,同时生成HashKey):这个是最简单的

注意:Hash Key很有可能存在Hash值对撞的可能性,我们下面会将如何解决这个问题

脚本
虽然我们实现的方法有多种,在此,我们以方法2为例,上脚本:
HashKey_V2.sql (2.05 KB, 下载次数: 784)
  1. use test
  2. go

  3. --drop test table if exists
  4. if OBJECT_ID('dbo.test_for_hashkey','U') is not null
  5. drop table dbo.test_for_hashkey
  6. GO
  7. --create test table
  8. create table dbo.test_for_hashkey
  9. (
  10. id int identity(1,1) primary key
  11. ,SearchKeyword varchar(2000) not null
  12. ,SearchKeyword_hashkey as checksum(SearchKeyword) PERSISTED not null
  13. );

  14. --create index of hask key column
  15. create index ix_DBA_SearchKeyword_hashkey
  16. ON dbo.test_for_hashkey(SearchKeyword_hashkey);
  17. GO

  18. --data init.
  19. declare
  20. @loop int
  21. ,@do int
  22. ,@SearchKeyword varchar(2000)
  23. ;

  24. select
  25. @loop = 100000
  26. ,@do = 1
  27. ;

  28. while @do <= @loop
  29. begin
  30. set
  31. @SearchKeyword = REPLICATE(newid(),55)
  32. ;
  33. insert into dbo.test_for_hashkey
  34. select @SearchKeyword
  35. ;

  36. set @do = @do + 1
  37. end
  38. go

  39. -------------------performance testing
  40. declare
  41. @SearchKeyword varchar(2000)
  42. ,@SearchKeyword_hashkey int
  43. ;

  44. select TOP 1
  45. @SearchKeyword = SearchKeyword
  46. FROM dbo.test_for_hashkey WITH(NOLOCK)
  47. where id = 20120;

  48. set
  49. @SearchKeyword_hashkey = CHECKSUM(@SearchKeyword)
  50. ;

  51. --statistics time & io opening
  52. set statistics time on
  53. set statistics io on

  54. select *
  55. FROM dbo.test_for_hashkey WITH(NOLOCK)
  56. where SearchKeyword = @SearchKeyword
  57. ;
  58. /*如果直接使用SearchKeyword来检索,性能消耗

  59. Table 'test_for_hashkey'. Scan count 3, logical reads 27602, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  60. SQL Server Execution Times:
  61. CPU time = 109 ms, elapsed time = 121 ms.
  62. */

  63. select *
  64. FROM dbo.test_for_hashkey WITH(NOLOCK)
  65. where SearchKeyword_hashkey = @SearchKeyword_hashkey
  66. --这个条件是为了防止hash对撞
  67. and SearchKeyword = @SearchKeyword
  68. ;

  69. /*如果使用hash key来检索,性能消耗
  70. Table 'test_for_hashkey'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  71. SQL Server Execution Times:
  72. CPU time = 0 ms, elapsed time = 0 ms.
  73. */

  74. set statistics time off
  75. set statistics io off
复制代码

说明

  • Hash对撞:在大量数据测试的,可能导致Hash值对撞的可能,也就是说可能会存在不同的字段值对应于相同的hash Key。我们解决这个问题的方法是:
    1. select *
    2. FROM dbo.test_for_hashkey WITH(NOLOCK)
    3. where SearchKeyword_hashkey = @SearchKeyword_hashkey
    4. --这个条件是为了防止hash对撞
    5. and SearchKeyword = @SearchKeyword
    复制代码

  • 这个与早些时候的帖子“使用fulltext解决Like完全模糊匹配的性能问题”均是优化宽字段查询的性能问题帖子地址:http://www.itpub.net/thread-1587348-1-1.html。只不过这个帖子是解决款字段等于某常量的情况,前面的帖子是解决Like完全模糊匹配的情况
  • 性能测试结果:在10万数据的时候测试,从logical reads、CPU和时间消耗来看,优化效果很明显


优化前
/*如果直接使用SearchKeyword来检索,性能消耗
Table 'test_for_hashkey'. Scan count 3, logical reads 27602, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
   CPU time = 109 ms,  elapsed time = 121 ms.
*/

优化后
/*如果使用hash key来检索,性能消耗
Table 'test_for_hashkey'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
*/

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2012-3-10 12:41 | 只看该作者
好帖,顶起来,希望看到更多分享~

使用道具 举报

回复
论坛徽章:
171
ITPUB社区OCM联盟徽章
日期:2013-07-30 11:25:46最佳人气徽章
日期:2013-03-19 17:13:45ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30ITPUB季度 技术新星
日期:2012-05-22 15:10:11BLOG每日发帖之星
日期:2012-02-15 16:43:07生肖徽章2007版:马
日期:2012-03-07 10:13:26蓝锆石
日期:2012-02-24 10:13:15萤石
日期:2012-02-24 10:13:15海蓝宝石
日期:2012-02-24 10:13:15紫水晶
日期:2012-03-01 21:28:36
20#
发表于 2012-3-10 13:09 | 只看该作者
这个也有bug~

使用道具 举报

回复

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

本版积分规则 发表回复

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