- 浏览: 119228 次
文章分类
问题场景:客户反应网站上的产品详情页面打开时,速度很慢。
运行环境:
数据库服务器 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 2103直接上菜! 问题场景1 ... -
万恶的隐式数据类型转换
2013-04-26 17:23 11532年前上线的系统了,运 ... -
[整理]一行变多行(Oracle)
2013-04-10 10:27 2585来源:http://www.itpub.net/thread- ... -
获取行号
2013-04-10 10:10 889MySQL select @rownum:=@rownum+1 ... -
行转列,列转行
2013-04-09 10:23 912SQL Server http://www.cnblogs.c ... -
多行(结果集)拼接字符串 (多行变一行)
2013-04-09 10:18 1947SQL Server版: select stuff( ... -
[转载]SQL Server 2005,2012 DTS导入平面数据
2013-04-09 10:04 1376SQL Server 2005,2012 DTS导入 ... -
SQL Server 2005作业未定义作业服务器
2013-04-02 19:47 1172对客户服务器上的数据库新增维护计划,(保存和)执行作业失败: ... -
两句SQL对比
2013-02-27 10:45 842--very very bad code select ... -
mssql len datalength oracle:length lengthb mysql: length char_length
2012-12-10 17:18 1931字符长度:oracle length(),mysql char ... -
sql server字符串非空判断
2012-11-07 17:24 1831select * from tableA a where le ... -
sqlserver 日期格式转换为字符串
2012-11-07 16:57 1324select GETDATE() ----------- ...
相关推荐
ESP-12S(WT8266-S6) 模块规格书 ESP-12S(WT8266-S6) 是一款小型、低功耗、低成本的 Wi-Fi 模块,广泛应用于物联网、智能家居、工业自动化等领域。本规格书对 ESP-12S(WT8266-S6) 模块的规格、特性和应用进行了详细...
ESP8266-12S是一款基于ESP8266芯片的Wi-Fi模块,由深圳市汇思锐科技有限公司生产。ESP8266系列芯片是乐鑫科技(Espressif Systems)推出的一种高性能、低成本的Wi-Fi集成电路,广泛应用于物联网(IoT)设备,如智能...
ESP-12S WIFI模块的原理图和产品试用部分在文档中未给出具体内容,但可以推测,原理图部分可能会详细介绍ESP-12S WIFI模块的电路设计和各个部件的连接方式,产品试用部分则可能介绍如何对ESP-12S WIFI模块进行实际...
Cisco 3750G-12S 3750G-24T 3750G-48TS 3750G系列机器固件 稳定版本
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...
相当于格式化,使用该文件可以清空ESP-12SWIFI模块的所有内容
标题 "ESP-12S-A9-A9G-GPRS-Node-v1.0-master" 提供的信息表明,这是一个关于基于ESP模块(可能是ESP8266或ESP32的变体ESP-12S)与A9G模块集成的项目,用于实现GPRS功能的节点设备,版本为1.0,并且是基于Arduino ...
ESP8266 的MQTT AT固件,可以通过AT指令连接阿里云,并使用MQTT进行主题的订阅与发布
### 马兰士VP-12S4投影机使用手册关键知识点 #### 一、安全警示与操作注意事项 在阅读《马兰士VP-12S4投影机使用手册》时,首先需要关注的是安全警告及操作注意事项,这对于确保设备的安全使用至关重要。 1. **...
ESP-12S音控雪花灯-硬件到软件一、功能介绍二、雪花灯硬件三、软件教程1、下载并安装Arduino IDE2、下载并安装blinker APP3、修改编译并上传程序四、 绑定天猫精灵(前提要有一台智能音箱)五、ESP8266控制全彩灯环...
- 本产品遵循国家标准GB 6932-2015,适用于中国境内销售和使用。 总的来说,这款海尔燃气热水器的使用和维护涉及到了安全、效率和用户友好性,用户在使用前应详细阅读说明书,以确保安全、正确地安装和操作。此外...
TI-TPD12S520 HDMI Receiver Port Protection and Interface Device TI-TPD12S520是一款单芯片高清晰度多媒体接口(HDMI)接收器端口保护和接口设备,专门为HDMI接收器提供静电放电(ESD)保护和接口功能。该器件...
造价咨询企业按照造价常用文件
在具体介绍知识点之前,我们首先需要明确,由于提供的信息中缺乏足够的具体内容,无法生成精确的知识点。不过根据标题“精品资料系列2021-新12S2给水工程.pdf”和描述“精品资料系列2021-新12S2给水工程.pdf”我们...
TPD12S015A 的详细产品信息中包括了该芯片的特点、应用场景、技术信息、订购信息、开发资源、技术支持等信息。 TPD12S015A 是一款功能强大且灵活的 HDMI 配套芯片,适用于各种电子产品的设计和开发。
esp8266开发控制,开发硬件为arduino
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封装等,仅为方便广大网友使用。我司虽然在制作过程中已经仔细核对和检查,但烦请用户使用前一定要仔细核对,我司对于因用户使用该封装...
- **TTL 关断功能**:具备 TTL 控制的关断功能,关断模式下的功耗极低,仅约 50μA。 - **过温保护和限流保护**:内置过温保护和周期性电流限制功能,确保在故障条件下设备的安全运行。 #### 三、应用领域 - **...