【性能诊断】二、单功能场景的性能分析(fiddler、SQL Profiler)
2015-06-11 15:31
423 查看
Fiddler
fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据。 使用Fiddler无论对开发还是测试来说,在诊断分析问题时,都有很大的帮助。下载地址:http://www.telerik.com/download/fiddler
工作原理和使用说明可参考:http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html
当然我们如果仅开发WEB系统,使用浏览器自身的开发者工具也可以看到http的请求响应时间。不再赘述。
SQL Profiler
对于企业应用系统,绝大部分单功能的性能问题出现在数据库的SQL脚本执行上,所以当我们发现fiddler中有响应时间较长的http请求时,往往做的第一件事就是跟踪出该功能执行的SQL,找出响应时间最长的SQL脚本,直接执行该SQL,分析IO、执行计划。一般来说,逻辑IO是SQL性能的主要因素。如果数据库使用的是sqlserver,这个工作会比较简单,,我们可以使用sqlserver Profiler直接使用缺省设置即可(但sqlserver本身其实很复杂,即使是这简单的Profiler工具,在深入使用的时候也有很大的学问,以后有机会我会再针对sqlserver起一个专题)。
使用Oracle数据库的话,可以借助性能视图找出性能较差的SQL。sqlserver也有大量的动态性能视图,不过sqlserver的图形界面工具做的如此优秀,以至于我们只有在整体性能下降等复杂场景下才使用它。
在此我们仅以Oracle为例,列出常用的一些性能视图的SQL脚本。当然如果我们的业务系统本身提供了获取SQL脚本的功能或机制更好。
--.查找前十条性能差的sql(磁盘读取较大,缺少索引或语句不合理) SELECT * FROM (SELECT PARSING_USER_ID EXECUTIONS, SORTS, COMMAND_TYPE, DISK_READS, sql_text FROM v$sqlarea ORDER BY disk_reads DESC) WHERE ROWNUM < 10; SELECT sql_text, hash_value, executions, buffer_gets, disk_reads, parse_calls FROM V$SQLAREA WHERE buffer_gets > 10000000 OR disk_reads > 1000000 ORDER BY buffer_gets + 100 * disk_reads DESC;
-- 最近10分钟最消耗CPU的SQL语句: select sql_text from ( select sql_id,count(*) as cn from v$active_session_history where sample_time > sysdate - 10/24/60 and session_type <> 'BACKGROUND' and SESSION_STATE = 'ON CPU' group by sql_id order by cn desc ) ash, v$sql s where ash.sql_id=s.sql_id; -- 最近10分钟最消耗IO的SQL语句: select sql_text from ( select sql_id,count(*) as cn from v$active_session_history where sample_time > sysdate - 10/24/60 and session_type <> 'BACKGROUND' and WAIT_CLASS='User I/O' group by sql_id order by cn desc ) ash, v$sql s where ash.sql_id=s.sql_id;
在plsql中查看SQL的执行计划时,我一般增加IO和CPU耗费两项。
在sqlplus等工具中,可以使用如下命令查看执行计划与IO
-- explain plan for select count(1) from emp a where a.dept_no=5; select * from table(dbms_xplan.display()); -- set autotrace traceonly exp;
相关文章推荐
- MySQL中SELECT+UPDATE处理并发更新问题解决方案分享
- sql注入攻击(三)sql注入解决办法
- SQL中EXISTS的用法(转自博客园:Dsw)
- Oracle 11203 + ASM安装 for HP UX
- 故障案例:磁盘空间不足可能引起的mysql问题
- java调用oracle函数
- LIST OF NOSQL DATABASES [currently 150]
- SQL中大概有这么几种JOIN
- oracle数据库学习之路(三)-----%TYPE和%ROWTYPE
- JdbcTemplate类对sql的操作使用
- redis重启后,相关文件加载顺序
- corosync+pacemaker+drbd+mysql
- sql注入攻击详解(二)sql注入过程详解
- SaltStack源码分析之Redis Returner
- Mysql SQL优化&执行计划
- sql注入一注入原理讲解
- oracle的分页查询碰到的一个小问题
- mysql大的记录写入或更新失败
- PostgreSQL备份恢复
- 讨论oracle在rowid和rownum