资源描述:
《SQL优化汇总ORACLE》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、十月15,2012SQL性能优化汇总作者:eric.zhu创建日期:十月15,2012最后更新日期:十月15,2012参考:版本:1.0.0i十月15,2012文档控制变更记录46日期作者版本变更说明2012-06-29liang.zhu1.0初版审阅姓名职位分发拷贝编号姓名位置/岗位1234i十月15,2012目录文档控制2SQL优化概述5SQL优化概述5SQL共享原理5SQL优化诊断6OracleSQL优化诊断6执行计划6SQL优化技巧8SQL优化技巧8绑定变量8自动绑定器14索引15提交事物处理16锁表16已解决及待解决问题i待解决问题i已解决问题ii
2、十月15,2012SQL优化概述SQL优化概述lOracle优化性能因素lSQL共享原理l设置跟踪文件Oracle优化性能因素Oracle优化性能因素1.硬件的环境cpu,内存,网络传输条件等均会影响到oracle的性能。2.数据库运行的配置参数这可能是由于糟糕的建议或是错误的假设造成的。大多数项目都可以在基本参数下实现可接受的性能。特别是,SPIN_COUNT等你和闩相关的参数,以及没有在文档中提及的优化特性可能会造成严重的问题,这需要相当大的调查。同样,在初始化参数文件中设置的优化参数可能覆盖了经过验证的优化过的执行计划。因此,模式,模式统计和优化器设置
3、应该一起考虑和管理。这在大部分时间已经由DBA设置好了。3.对于不合理的表结构设计对于不合理的表结构对性能的影响,当前有一张表,存储了用户手机号码,在统计时需要对用户的手机号码进行分类统计,而另一张表中存储了与手机号码前四或前七位匹配的地区名称,这时间程序员写了一条sql语句为:select*fromuserPhone,Userareawhere(left(userPhone.phone,4)==userarea.idorleft(userPhone,7)==userarea.id);该语句在前期userPhone表数据量不多时,没有感觉到性能方面的影响,但
4、当userPhone达到1万条时,性能迅速降低,经过分析后,确定是由于表结构不太合理,于是在userPhone中增加一个userarea的id列,sql语句修改为select*fromuserPhone,UserareawhereuserPhone.areaid==userarea.id),程序运行性能恢复正常.4.烂SQL这很大一部分由我们开发原因没有注意到自己写的Sql执行效率的问题导致,可能导致的原因很多,这正是我写着文档所要达到的目标。i十月15,2012SQL共享原理共享原理ORACLE将执行过的SQL语句存放在内存的共享池(sharedbuffe
5、rpool)中,可以被所有的数据库用户共享。当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径.这个功能大大地提高了SQL的执行性能并节省了内存的使用。为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。这块位于系统全局区域SGA(systemglobalarea)的共享池(sharedbufferpoo1)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前执行过的语句完全相同,O
6、racle就能很快获得已经被解析的语句以及最好的执行方案。Oracle的这个功能大大地提高了SQL的执行性能并节省了内存的使用。可惜的是,Oracle只对简单的表提供高速缓冲(cachebufferiIlg),这个功能并不适用于多表连接查询。数据库管理员必须在启动参数文件中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当向Oracle提交一个SQL语句时,Oracle会首先在这块内存中查找相同的语句。i十月15,2012SQL优化诊断OracleSQL优化诊断l执行计划l设置跟踪文件lTRC文件查看执行计划
7、执行计划我们对SQL语句进行调优时,非常重要的一个方法就是分析SQL的执行计划。查看Oracle中SQL语句的执行计划有很多方法,例如通过PL/SQLDeveloper、EM或者SQLPLUS工具等。在网上搜索了一些比较重要的知识点,以备忘。Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值。不过你可以像使用其它列那样使用它,但是不能删除改列,也不能对该列的值进行修改、插入。一旦一行数据插入数据库,则rowid在该行的生命周期内是唯一的,即
8、即使该行产生行迁移,行的rowid也不会改变。Rec