paip.程序功能时间性能优化及SQL语句优化
作者Attilax, 1466519819@qq.com
SQL语句优化工具SQL Tuning&LECCO SQL Exper2
有时候,一个功能可能需要26秒的时候才能完成,我想是性能出了问题..那如何优化性能呢..
ASP。NET网站,可以使用VS2010的代码分析工具,找出节点…
JAVA网站,可以使用相应的工具
PHP的,也有相应的工具..这里以PHP为例子..
跟踪工具XDEBUG
首先,我们需要跟踪代码中哪些方法出了问题..需要一个跟踪工具,这里以XDEBUG为例..
开启profiler::
xdebug.profiler_enable=On
xdebug.profiler_output_dir="d:\xdebug"
xdebug.profiler_output_name="script"
;xdebug.profiler_aggregate=on
xdebug.profiler_append=on
xdebug.profiler_enable_trigger=on
注意:xdebug.profiler_aggregate这个参数不要设置,否则APACHE启动了不报错,但是却不能访问网站..我的XD版本是v2.1.0,PHPV 5.2.5 , APACHE版本2.2.x
它生成的日志,详细,虽然人类可读,但是为了更好的分析,需要加载一个分析工具
如果所用的代码语言没有好的跟踪工具,可以使用时间函数采用二分查找法算出时间值。。一般都是在SQL语句调用处会有性能差的情况
Profiler日志分析工具WinCacheGrind
切换到OVERALL TAB页,可看到所有方法函数调用次数,以及总时间..按消耗总时间排序..
先在上面选择中一条,下边可详细显示所有的调用此函数的代码文件行数..并有消耗时间..
找到时间最长的那条函数。。
然后回到最上面,选中此函数,则下边会显示出它的详细被调用情况,以及文件代码页行数.
这样,就得到结果了,是SQL语句调用错误
从代码中得到完整的SQL语句以便测试
代码中的SQL语句往往是不完整的,有各种变量等,先用调试器加载,打上断点。中断后然后WATCH express功能,得到完整的SQL语句
测试SQL语句时间
可放入GUI管理器,一般可以得到执行SQL的时间,比如13秒..如果第二次执行时时间大大缩短,是因为服务器启用了缓存。可以使用关键字SQL_NO_CACHE禁用此SQL语句的缓存
禁用SQL缓存
因为一般网站及SQL服务器均有缓存,会影响到跟踪,需要禁用..
或者在目录下删除缓存文件…可以使用SVN的红色惊叹号找出最新修改的存文件,删除
重启SQL服务器,清除SQL缓存
还可使用关键字"SELECT SQL_NO_CACHE count(*) FROM xxx” 来在SQL语句中不使用缓存
SQL语句优化工具SQL Tuning&LECCO SQL Exper
LECCO SQL Expert人工智能自动SQL优化
LECCO SQL Expert就采用了这种人工智能技术,其SQL Expert支持Oracle、Sybase、MS SQL Server和IBM DB2数据库平台。其突出特点是自动优化SQL语句。除此以外,还可以以人工智能知识库“反馈式搜索引擎”来重写SQL语句,并找出所有等效的SQL语句及可能的执行计划,通过测试运行为应用程序和数据库自动找到性能最好的SQL语句
SQL Tuning 简介
SQL Turning 是Quest公司出品的Quest Central软件中的一个工具。
Quest Central(图1)是一款集成化、图形化、跨平台的数据库管理解决方案,可以同时管理 Oracle、DB2和 SQL server 数据库。它包含了如下的多个工具:
? 数据库管理(DBA)
? 数据库监控(Monitoring Pack)
? 数据库诊断 (Spotlight Diagnostics)
? 数据库分析 (Database Analysis)
? SQL优化 (SQL Tuning)
? 空间管理 (Space Management)
? 压力测试 (Load Generator)
? 数据生成 (Data Generator)
? PL/SQL 开发 (TOAD)
参考:SQL优化工具_晨曦阳光_新浪博客
人工优化流程与思路
当没有合适的自动化工具时,就需要人工优化
可以用EXPLAIN功能查看抓取的ROWS,如果过多,则当然会影响性能了..
A.是否LEFT JOIN多表连接
可考虑SQL语句是否多表连接,特别是 LEFT JOIN多表连接(大于两个表)。。
如果是LEFT JOIN两个表连接,一般也不会太影响性能。。但是三个表连接就会大大影响性能.
可以先分别两两连接,分成两个SQL语句,然后UNION。。在此过程中需要使用SQL格式化工具进行调试。。
经过这样的优化,SQL执行时间就从13秒下降到50MS了。圆满成功..
B. 进行分拆然后UNION
如果不是LEFT JOIN的情况,最好的办法就是把SQL语句一条条拆出来,然后分别执行找到原因。。连接的时候使用INNER JOIN,然后分别UNION就可以了。。
C.多条SQL分别用代码执行.
如果确实在SQL上没办法,可以把SQL分拆成多个小语句,然后用代码分别执行就OK了..然后在程序端进行UNION,排序什么的。。就可以了..
SQL语句格式化工具
http://www.orczhou.com/sqlparser/sqlbeautifier/index.php
这个在线工具很强大..错误的SQL也可以格式化强。。有语法关键字高亮..
是针对MySQL的,作者从phpMyAdmin中抠出来的,php-SQL-Format,
sqlPP 则只能格式化正确的SQL语句
调试错误SQL语句
因为复杂的SQL查询语句往往格式不清,SQL执行器报错只龙统的说是在哪一行,很难查清原因..
对于条件复杂的语句,在格式化后,放在MYSQL gui tool中,就可以很容易得到错误语句的行号
SQL语句复杂条件优先级格式化EXPLAIN
有时候,一些复杂语句条件很多,AND,OR 等连在一起,分不清优先级,可以先格式化,调试正确,然后使用EXPLAIN功能,会得到一个条件优先级都格式化好的SQL。。它把条件优先级用正确的括号括起来了。一下子就看出来了优先级
参考
SQL语句的自动优化_Mysql_中国网管联盟bitsCN_com_php.mht
MySQL高速缓存 -王惠达 - 51CTO技术博客
sql格式化工具集合_Mysql_脚本之家
SQL优化工具_晨曦阳光_新浪博客