- 浏览: 115949 次
文章分类
问题场景:客户反应网站上的产品详情页面打开时,速度很慢。
运行环境:
数据库服务器 32位SQL Server 2005 开发者版SP2 开启了AWE
应用服务器 JDK 1.6,Tomcat 6.0
解决步骤:
1.火狐,Firebug>网络 查看打开该页面后的时间线 确实是数据查询耗时长导致页面加载慢。
2.懒得拉代码配置测试环境了(这个项目不能实行热部署,改了程序不能直接看到效果,不太爽),直接在客户机器上通过SQL Server Profiler创建跟踪来获取耗时长的查询。跟踪时间只是点开产品详情页面前后大约15s,这段时间内有一条查询的CPU、IO占用都高的离谱,所以很容易就确定了就是这条慢查询导致的页面打开慢。通过报表看,这条查询平均占用CPU时间8s多,已经执行2W多次。。。。。
3.将查询拷到Management Studio,添加参数值,设置统计io和time开关,开启实际执行计划,执行查询,分析结果。定位到union前后的两段查询条件重复,导致对连接的另一张大表逻辑读达到40W+,于是改写查询条件,时间缩短为0.15s左右。
4.提交开发的同事修改,问题解决。
后记:
开发的同事修改之后,速度并无明显改善,于是乎,重来步骤2,发现当product_status字段(varchar类型)的值为'50'时,查询的代价要明显高于传入值为50的情况。这个很费解。。
上执行计划(计划中不同的部分)
对product_info逻辑读5W次
对product_info逻辑读124W次
详细的不说了(现在我也说不清,只能感觉到要调整索引),上解决方案:
新增索引
上新增索引后的执行计划:
对product_info逻辑读降为7K,CPU占用时间约为100ms
对比最初的开销,性能提升非常大,刚开始看执行计划,脑袋晕了,优化就暂时先做到这一步。
运行环境:
数据库服务器 32位SQL Server 2005 开发者版SP2 开启了AWE
应用服务器 JDK 1.6,Tomcat 6.0
解决步骤:
1.火狐,Firebug>网络 查看打开该页面后的时间线 确实是数据查询耗时长导致页面加载慢。
2.懒得拉代码配置测试环境了(这个项目不能实行热部署,改了程序不能直接看到效果,不太爽),直接在客户机器上通过SQL Server Profiler创建跟踪来获取耗时长的查询。跟踪时间只是点开产品详情页面前后大约15s,这段时间内有一条查询的CPU、IO占用都高的离谱,所以很容易就确定了就是这条慢查询导致的页面打开慢。通过报表看,这条查询平均占用CPU时间8s多,已经执行2W多次。。。。。
3.将查询拷到Management Studio,添加参数值,设置统计io和time开关,开启实际执行计划,执行查询,分析结果。定位到union前后的两段查询条件重复,导致对连接的另一张大表逻辑读达到40W+,于是改写查询条件,时间缩短为0.15s左右。
4.提交开发的同事修改,问题解决。
后记:
开发的同事修改之后,速度并无明显改善,于是乎,重来步骤2,发现当product_status字段(varchar类型)的值为'50'时,查询的代价要明显高于传入值为50的情况。这个很费解。。
上执行计划(计划中不同的部分)
Sort(TOP 1, ORDER BY:([t].[dbgndate] ASC)) |--Filter(WHERE:(CONVERT_IMPLICIT(int,[db].[dbo].[product_info].[product_status] as [t].[product_status],0)=(50) AND CONVERT(varchar(100),[db].[dbo].[product_info].[dbgndate] as [t].[dbgndate],23)>=CONVERT(varchar(100),getdate(),23) AND ([db].[dbo].[product_info].[product_issue] as [t].[product_issue]='2' OR [db].[dbo].[product_info].[product_issue] as [t].[product_issue]='3'))) |--Nested Loops(Inner Join, OUTER REFERENCES:([t].[uid])) |--Index Seek(OBJECT:([db].[dbo].[product_info].[ix_t_product_ulineid] AS [t]), SEEK:( [t].[ulineid] =[db].[dbo].[t_line].[uid] as [tl].[uid] ) ORDERED FORWARD)
对product_info逻辑读5W次
Top(TOP EXPRESSION:((1))) |--Filter(WHERE:([db].[dbo].[product_info].[product_issue] as [t].[product_issue]='2' OR [db].[dbo].[product_info].[product_issue] as [t].[product_issue]='3')) |--Nested Loops(Inner Join, OUTER REFERENCES:([t].[uid])) |--Index Seek(OBJECT:([db].[dbo].[product_info].[ix_product_info_status_dbgndate] AS [t]), SEEK:( [t].[cstatus]='50'), WHERE:([db].[dbo].[product_info].[ulineid] as [t].[ulineid] =[db].[dbo].[t_line].[uid] as [tl].[uid] AND CONVERT(varchar(100),[db].[dbo].[product_info].[dbgndate] as [t].[dbgndate],23) >=CONVERT(varchar(100),getdate(),23) ) ORDERED FORWARD)
对product_info逻辑读124W次
详细的不说了(现在我也说不清,只能感觉到要调整索引),上解决方案:
新增索引
create index ix_product_info_ulineid_status_dbgndate on product_info(ulineid, product_status, dbgndate) include(product_issue, uid);
上新增索引后的执行计划:
|--Nested Loops(Inner Join, OUTER REFERENCES:([tl].[uid], [Expr1038]) WITH ORDERED PREFETCH) |--Sort(ORDER BY:([tl].[dupdate] DESC)) | |--Index Seek(OBJECT:([db].[dbo].[t_line].[ix_t_line_cstatus_cissue] AS [tl]), SEEK:([tl].[cstatus]='50' AND [tl].[cissue]='2' OR [tl].[cstatus]='50' AND [tl].[cissue]='3') ORDERED FORWARD) |--Top(TOP EXPRESSION:((1))) |--Index Seek(OBJECT:([db].[dbo].[product_info].[ix_t_product_info_ulineid_cstatus_dbgndate] AS [t]), SEEK:([t].[ulineid]=[db].[dbo].[t_line].[uid] as [tl].[uid] AND [t].[product_status]='50'), WHERE:(CONVERT(varchar(100),[db].[dbo].[product_info].[dbgndate] as [t].[dbgndate],23)>=CONVERT(varchar(100),getdate(),23) AND ([db].[dbo].[product_info].[product_issue] as [t].[product_issue]='2' OR [db].[dbo].[product_info].[product_issue] as [t].[product_issue]='3')) ORDERED FORWARD) | | | |--Clustered Index Seek(OBJECT:([db].[dbo].[product_info].[pk_y_product_info_uid] AS [tt]), SEEK:([tt].[uid]=[db].[dbo].[product_info].[uid] as [t].[uid]) ORDERED FORWARD)
对product_info逻辑读降为7K,CPU占用时间约为100ms
对比最初的开销,性能提升非常大,刚开始看执行计划,脑袋晕了,优化就暂时先做到这一步。
发表评论
-
工作中遇到的SQL Server索引相关问题(过多、缺失、启用)
2013-04-27 11:07 2059直接上菜! 问题场景1 ... -
万恶的隐式数据类型转换
2013-04-26 17:23 11222年前上线的系统了,运 ... -
[整理]一行变多行(Oracle)
2013-04-10 10:27 2517来源:http://www.itpub.net/thread- ... -
获取行号
2013-04-10 10:10 832MySQL select @rownum:=@rownum+1 ... -
行转列,列转行
2013-04-09 10:23 853SQL Server http://www.cnblogs.c ... -
多行(结果集)拼接字符串 (多行变一行)
2013-04-09 10:18 1902SQL Server版: select stuff( ... -
[转载]SQL Server 2005,2012 DTS导入平面数据
2013-04-09 10:04 1342SQL Server 2005,2012 DTS导入 ... -
SQL Server 2005作业未定义作业服务器
2013-04-02 19:47 1147对客户服务器上的数据库新增维护计划,(保存和)执行作业失败: ... -
两句SQL对比
2013-02-27 10:45 822--very very bad code select ... -
mssql len datalength oracle:length lengthb mysql: length char_length
2012-12-10 17:18 1868字符长度:oracle length(),mysql char ... -
sql server字符串非空判断
2012-11-07 17:24 1801select * from tableA a where le ... -
sqlserver 日期格式转换为字符串
2012-11-07 16:57 1289select GETDATE() ----------- ...
相关推荐
E:\项目_2016\..\ESP8266-12S.SchDoc深圳市汇思锐科技有限公司ESP8266-12F wifi模块。
ESP-12S.PDF
MT7955-12W-12S1P-330mA-简化版-Rev2.2-2012-9-27.zip程序资料开关电源设计电路原理资料MT7955-12W-12S1P-330mA-简化版-Rev2.2-2012-9-27.zip程序资料开关电源设计电路原理资料MT7955-12W-12S1P-330mA-简化版-Rev2.2...
ESP8266 的MQTT AT固件,可以通过AT指令连接阿里云,并使用MQTT进行主题的订阅与发布
相当于格式化,使用该文件可以清空ESP-12SWIFI模块的所有内容
ESP-12s产品规格书
安信可ESP-12S WIFI文档,安信可利用ESP8266芯片封装的12S模块,可以快速连接WIFI路由器,从而实现物联网!!
Cisco 3750G-12S 3750G-24T 3750G-48TS 3750G系列机器固件 稳定版本
ESP-12S音控雪花灯-硬件到软件一、功能介绍二、雪花灯硬件三、软件教程1、下载并安装Arduino IDE2、下载并安装blinker APP3、修改编译并上传程序四、 绑定天猫精灵(前提要有一台智能音箱)五、ESP8266控制全彩灯环...
Implement A9G module with ESP based in arduno IDE
Haier海尔燃气热水器JSQ24-12S1(12T)使用说明书用户手册图解图示pdf电子版下载
说明书,用户安装和调试.给马兰士投影机爱好者
精品资料系列2021-新12S2给水工程.pdf
造价咨询企业按照造价常用文件
esp8266开发控制,开发硬件为arduino
TI-TPD12S521.pdf
TI-TPD12S520.pdf
Catalyst 3750G-12S-SD Switch Catalyst 3750G-24PS Switch Catalyst 3750G-24T Switch Catalyst 3750G-24TS Switch Catalyst 3750G-24TS-1U Switch Catalyst 3750G-48PS Switch Catalyst 3750G-48TS Switch ...
免责声明:附件内容分享的ESP8266模块官方AD封装库,包括ESP-12S/ESP-12E&F封装等,仅为方便广大网友使用。我司虽然在制作过程中已经仔细核对和检查,但烦请用户使用前一定要仔细核对,我司对于因用户使用该封装...
变频器说明书系列-XBT12S目录.doc