paip.程序功能时间性能优化及SQL语句优化

时间:2022-10-11 20:17:15

paip.程序功能时间性能优化及SQL语句优化

 

作者Attilax 1466519819@qq.com

 

跟踪工具XDEBUG..1

Profiler日志分析工具WinCacheGrind.2

从代码中得到完整的SQL语句以便测试...2

测试SQL语句时间...2

禁用SQL缓存...2

SQL语句优化工具SQL Tuning&LECCO SQL Exper2

人工优化流程与思路...3

SQL语句格式化工具...4

调试错误SQL语句...4

SQL语句复杂条件优先级格式化EXPLAIN..4

参考...4

 

 

有时候,一个功能可能需要26秒的时候才能完成,我想是性能出了问题..那如何优化性能呢..

ASPNET网站,可以使用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支持OracleSybaseMS SQL ServerIBM DB2数据库平台。其突出特点是自动优化SQL语句。除此以外,还可以以人工智能知识库“反馈式搜索引擎”来重写SQL语句,并找出所有等效的SQL语句及可能的执行计划,通过测试运行为应用程序和数据库自动找到性能最好的SQL语句

 

 

 SQL Tuning 简介
SQL Turning Quest公司出品的Quest Central软件中的一个工具。
Quest Central(图1)是一款集成化、图形化、跨平台的数据库管理解决方案,可以同时管理 OracleDB2 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

有时候,一些复杂语句条件很多,ANDOR 等连在一起,分不清优先级,可以先格式化,调试正确,然后使用EXPLAIN功能,会得到一个条件优先级都格式化好的SQL。。它把条件优先级用正确的括号括起来了。一下子就看出来了优先级

 

参考

SQL语句的自动优化_Mysql_中国网管联盟bitsCN_com_php.mht

MySQL高速缓存 -王惠达 - 51CTO技术博客

sql格式化工具集合_Mysql_脚本之家

SQL优化工具_晨曦阳光_新浪博客