楼主: arron刘

【案例讨论】从案例引发的对SQL Server性能调优的思考

[复制链接]
招聘 : Android开发
论坛徽章:
17
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51蜘蛛蛋
日期:2012-05-28 16:54:09双黄蛋
日期:2012-05-28 17:45:17ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
161#
发表于 2012-6-6 09:46 | 只看该作者
本帖最后由 yanyangtian4502 于 2012-6-6 09:47 编辑

那我说说索引的问题吧
这个问题 应该大家比较关心的

谈到索引,主要就是以下几个方面:
1.        索引碎片分析
2.        索引统计信息分析
3.        缺失索引分析
4.        无用索引分析
5.        高维护索引分析
6.        最常用索引分析
7.        索引使用资源分析(内存,磁盘,CPU)
8.        索引编辑(增删改查)

使用道具 举报

回复
招聘 : Android开发
论坛徽章:
17
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51蜘蛛蛋
日期:2012-05-28 16:54:09双黄蛋
日期:2012-05-28 17:45:17ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
162#
发表于 2012-6-6 09:54 | 只看该作者
本帖最后由 yanyangtian4502 于 2012-6-6 09:56 编辑

对于,索引碎片,主要就是在有索引的表上面不断的进行数据操作(增,删,改)
从而导致索引页上面出现很多的碎片空间,这一点和我们磁盘的碎片产生的道理类似,
索引碎片 找起来也简单,我也收集了一些查询,可以很快的找出碎片问题:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
DB_NAME() AS DatbaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, ROUND(s.avg_fragmentation_in_percent,2) AS [Fragmentation %]
INTO #TempFragmentation
FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE 1=2
EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempFragmentation
SELECT TOP 20
DB_NAME() AS DatbaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, ROUND(s.avg_fragmentation_in_percent,2) AS [Fragmentation %]
FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE s.database_id = DB_ID()
AND i.name IS NOT NULL
AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
ORDER BY [Fragmentation %] DESC'
SELECT top 20 * FROM #TempFragmentation ORDER BY [Fragmentation %] DESC
DROP TABLE #TempFragmentation

看到的效果图如下:



1.      开始重建碎片率大于80%的索引,语句如下:
ALTER INDEX 索引名字 ON 表名 REBUILD
注意:
索引名字:就是需要重建的索引的名字
表名:就是索引所在的表
例如,ALTER INDEX IX_keywordinfo_Type ON KeyWordInfo REBUILD
2.      按照上面的方法一个个的将索引重建,注意:建议在晚上或者周末的时候重建,否则,将会导致用户无法使用数据库。也可以在建立的时候采用online的方式,这种方式会异步的重建。

使用道具 举报

回复
论坛徽章:
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
163#
发表于 2012-6-6 09:57 | 只看该作者
yanyangtian4502 发表于 2012-6-6 09:54
对于,索引碎片,主要就是在有索引的表上面不断的进行数据操作(增,删,改)
从而导致索引页上面出现很多 ...

如果是Enterprise版本,可以加上online参数,就会好点

使用道具 举报

回复
论坛徽章:
0
164#
发表于 2012-6-6 12:23 | 只看该作者
Fragmentation 超过30%我就rebuild 了,表数据超过3千万,rebuild 一个index需要2-3 分钟,基本上需要downtime才能进行,
顺便问一下高人,在运行sys.dm_db_index_physical_stats很容易遇到内存问题,100GB的db,list dirty indexes :
SELECT object_name(ps.OBJECT_ID) table_name,b.name index_name,ps.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS ps
INNER JOIN sys.indexes AS b ON ps.OBJECT_ID = b.OBJECT_ID
AND ps.index_id = b.index_id
WHERE ps.database_id = DB_ID()
     and avg_fragmentation_in_percent>30
     and name is not null
ORDER BY avg_fragmentation_in_percent desc

Page life expectancy 可以从几万一下子掉到几十,online根本不敢做index clean.

使用道具 举报

回复
论坛徽章:
13
2012新春纪念徽章
日期:2012-01-04 11:56:19喜羊羊
日期:2015-03-04 14:52:46马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:10雪铁龙
日期:2013-09-11 10:30:25雪佛兰
日期:2013-08-07 14:34:372013年新春福章
日期:2013-02-25 14:51:24咸鸭蛋
日期:2012-11-01 17:05:28迷宫蛋
日期:2012-06-13 15:28:34
165#
发表于 2012-6-6 16:16 | 只看该作者
hyrongg 发表于 2012-6-6 12:23
Fragmentation 超过30%我就rebuild 了,表数据超过3千万,rebuild 一个index需要2-3 分钟,基本上需要downt ...

这种东西不都是半夜黑灯下火的时候扔给agent做嘛,干嘛online去做呢

使用道具 举报

回复
论坛徽章:
0
166#
发表于 2012-6-6 16:24 | 只看该作者
CareySon 发表于 2012-6-6 16:16
这种东西不都是半夜黑灯下火的时候扔给agent做嘛,干嘛online去做呢

系统7*24小时都很忙,越是黑灯瞎火的时候越忙。尝试早晨7点多用Agent,deadlock 一片啊

使用道具 举报

回复
论坛徽章:
13
2012新春纪念徽章
日期:2012-01-04 11:56:19喜羊羊
日期:2015-03-04 14:52:46马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:10雪铁龙
日期:2013-09-11 10:30:25雪佛兰
日期:2013-08-07 14:34:372013年新春福章
日期:2013-02-25 14:51:24咸鸭蛋
日期:2012-11-01 17:05:28迷宫蛋
日期:2012-06-13 15:28:34
167#
发表于 2012-6-6 16:30 | 只看该作者
hyrongg 发表于 2012-6-6 16:24
系统7*24小时都很忙,越是黑灯瞎火的时候越忙。尝试早晨7点多用Agent,deadlock 一片啊

那应该刚开始的时候更好的设计数据库来减少碎片...减少维护次数..

我们这块的程序有个功能,deadlock作为牺牲品的语句会被记录下来,然后re-try就行了。

我见过最恶心的是用GUID做主键...那碎片的百分比增长的快啊。。

使用道具 举报

回复
招聘 : Android开发
论坛徽章:
17
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51蜘蛛蛋
日期:2012-05-28 16:54:09双黄蛋
日期:2012-05-28 17:45:17ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
168#
发表于 2012-6-6 19:15 | 只看该作者
本帖最后由 yanyangtian4502 于 2012-6-6 19:15 编辑
hyrongg 发表于 2012-6-6 12:23
Fragmentation 超过30%我就rebuild 了,表数据超过3千万,rebuild 一个index需要2-3 分钟,基本上需要downt ...


你说的很对!你们只有一个数据库,有没有搞均衡 或者备用的?
在一台上面搞,确实容易出问题

使用道具 举报

回复
论坛徽章:
15
2010新春纪念徽章
日期:2010-03-01 11:08:292013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42灰彻蛋
日期:2012-01-11 12:03:01ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51ITPUB十周年纪念徽章
日期:2011-09-27 16:33:28ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:362010广州亚运会纪念徽章:马术
日期:2011-05-15 07:47:292010广州亚运会纪念徽章:龙舟
日期:2010-11-17 15:11:54
169#
发表于 2012-6-6 20:22 | 只看该作者

句句都是精华呀。看来楼主已经是得心应手了。
关于IO,之前搞过两篇文章:
http://topic.csdn.net/u/20101116 ... 9425bdeb.html?45133
http://topic.csdn.net/u/20101116 ... ede436505.html?7433

使用道具 举报

回复
论坛徽章:
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
170#
发表于 2012-6-7 08:20 | 只看该作者
Obuntu 发表于 2012-6-6 20:22
句句都是精华呀。看来楼主已经是得心应手了。
关于IO,之前搞过两篇文章:
http://topic.csdn.net/u/ ...

多谢Obuntu兄的支持

使用道具 举报

回复

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

本版积分规则 发表回复

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