欢迎来到天天文库
浏览记录
ID:21381571
大小:55.50 KB
页数:3页
时间:2018-10-21
《一次sqlserver调优经历》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、一次SQLServer调优经历>>教育资源库 前段时间数据库健康检查发现SQLServer服务器的idle时间变少,IO还是比较空闲,估计是遇到了高CPU占用的语句了。 介绍一下背景,我们公司负责运维N多的应有系统,负责提供良好的软、硬件环境,至于应用的开发质量,我们就无能为力了 解决这个问题,我的思路是: 找出CPU占用最大的语句。 分析查询计划。 优化。 1、找出语句 使用SQLServer自带的性能报表(不是报表服务),找出CPU占用最大的语句。如图1所示 图1性能报表 我选取了性能-按总CPU时间排在前面的查询,得出以下两张报表,如图2所示:
2、图2性能-按总CPU时间排在前面的查询 在报表中不能直接把语句Copy出来,非得让我另存为Excel才能Copy语句;而且经常标示不了是语句属于哪个数据库,不爽:(。 费了我九牛二虎之力才找出该条语句在哪个数据库执行,然后马上备份数据库,在另一个非生产数据库上面还原,创造实验环境。 废话少说,我把语句Copy出来,顺便整理了一下格式。如下:select*fromvieTransmissionUnit_LocalInfo ) andnode_code<> ( selectparentNodeCode fromTransmissionUnit_Rout
3、erInfo TransmissionUnit_LocalInfo ) ) 2、分析语句 执行计划如下: 图太大了,将就着看吧:(. 图3查询计划全图 图4查询计划1 图5查询计划2 图6查询计划3 从整个查询计划来看,主要开销都花在了图5的那个部分两个聚集索引扫描。 查看一下这两个数聚集索引扫描,搞什么飞机呢? 奇怪了,查询语句里面没有Log_Ne)ASend_time FROMLog_Nete=B.end_time 看着有点晕是吧,那么看看下图123下一页>>>>这篇文章来自..,。 3、优化 SQL写得好不好,咱不说,反正
4、我是不能改SQL的,而且应该可以判断出整个查询最耗时的地方就是用在搞这张试图了。 那就只能针对这个试图调优啦。仔细观察这个试图,实际上就涉及到一个表Log_Nete][varchar](100)NULL, [server_name][varchar](100)NULL, [start_time][datetime]NULL, [end_time][datetime]NULL, [status][varchar](30)NULL,CONSTRAINT[PK_LOG_ARYKEYCLUSTERED( [log_id]ASC)ARY])ON[PRIMARY] 数据量
5、有489957条记录,不算太大。 根据3、经常与其他表进行连接的表,在连接字段上应该建立索引; 感觉上得在node_code和end_time这两字段上建立一个复合索引,大概定义如下:CREATEINDEX[idx__Log_NeteASC) 保险起见,我把需要调优的语句copy到一个文件里,然后打开数据库引擎优化顾问,设置好数据库,得出以下调优结果:CREATESTATISTICS[_dta_stat_559341057_6_2]ON[dbo].[Log_Nete],[node_code])CREATENONCLUSTEREDINDEX[_dta_index_Log
6、_Nete]ASC)PDB=OFF,IGNORE_DUP_KEY=OFF,DROP_EXISTING=OFF,ONLINE=OFF)ON[PRIMARY] 嗯,结果差不多,具体参数再说。 按照数据库引擎优化顾问给出的建议,建立STATISTICS和INDEX。 再看看优化后的执行计划 明显查询vieissionUnit_RouterInfo'。扫描计数0,逻辑读取2次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表'TransmissionUnit_LocalInfo'。扫描计数3,逻辑读取6次,物理读取0
7、次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表'issionUnit_RouterInfo'。扫描计数0,逻辑读取2次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表'TransmissionUnit_LocalInfo'。扫描计数3,逻辑读取6次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表'work_listen'。扫描计数1,逻辑读取2次,物理读取0次,预读0次,
此文档下载收益归作者所有