|
数据库优化工作一直是羡慕的份,自己做的比较少,但是看过很多大牛的培训资料,感觉高手一定是在架构设计、表设计、分布式以及sql改写方面的牛人。具体到自己,只能是利用工具简单的去做些工作,主要思路如下:
1、首先定位有问题的sql语句--开发人员主动告诉你,或者通过ash、awr、addm巡检检查;
2、对于有问题的sql语句检查相关引用表的统计信息是否准确(经验丰富的,通过执行计划就可判断统计信息是否准确)
3、对于有问题的sql语句,一定要看执行计划。执行计划查看方式好多种,这里只列举数据库相关的,(pl/sql dev toad等开发工具自带的可以供参考)
3.1 使用AUTOTRACE查看执行计划
3.2 explain plan for select 语句
3.3 显示高级执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(FORMAT=>'ADVANCED -PROJECTION'));
高级执行计划可以看到QUERY BLOCK + OUTLINE DATA
3.4 显示特殊执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST’));
3.5 根据sqlid查看执行计划
select *
from table(dbms_xplan.display_cursor('8t2mm2acum4yk',
null,
'ADVANCED’));
4、根据执行该计划查看是否相关表走错了路径,产生笛卡儿积、有谓词推入、试图合并或者有大表被重复扫描等现象,以此来判断sql语句是建立相关索引还是
改写等来优化(改写一般需要sql开发技能及熟悉业务)
5、个人优化的一些总结
5.1 个人对sql开发技能比较差,一般对于sql优化大部分是建立索引来解决,但是索引需要了解单列索引、组合索引、函数索引、位图索引、反序索引等基本知识及应用场景。比如组合索引,那些列是适合放置在最前面的(一般是选择性较高的放置在租着索引列的最前面)
5.2对于复杂的sql语句一般使用oracle 的sql tuning advisor(STA)来进行优化。可以解决一部分比较负责的语句。
5.3 通过ADDM对于比较热的表缓存到cache中;
5.4 通过awr整体调整SGA内存大小减少物理IO;
5.5 sql改写只会一点with as。。。。
5.6 加hint提示,让sql语句走并行(一般是单表)、索引、hash、nl等连接方式来改变语句的执行计划。
6 综合来说,sql优化的本质就是检检查IO次数--可惜,只有羡慕大牛的份~
其他的oracle 可利用工具有sqlhc SQL 性能健康检查脚本 (SQLHC)(1626277.1) 及方法最佳实践:主动避免数据库和查询相关的性能问题(1549184.1) |
|