资源描述:
《ql优化-oracle数据库》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Sql优化-Oracle数据库sql优化-Oracle数据库Sql优化目的Sql优化原则绑定变量where条件索引排序和分页其他问题优化目的将每一次操作需要占用的数据量(IO)和资源(cpu,内存等)减少到最低,即在最短的时间达到最大的数据吞吐量更快的相应时间在有限资源内执行更多任务优化原则使用绑定变量,共享sql语句。消除不必要的大表全表搜索:不必要的全表搜索导致大量不必要的I/O,从而拖慢整个数据库的性能。在全表搜索是一个最快的访问方法时,将小表的全表搜索放到缓存内存中。确保最优的索引使用。确保最优的JOIN操作。确保所有操作都在内存中
2、完成。使用绑定变量,共享sql语句。Sql语句执行过程:1、语法检查(syntaxcheck)检查此sql的拼写是否语法。2、语义检查(semanticcheck)诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。3、对sql语句进行解析(prase)利用内部算法对sql进行解析,生成解析树(parsetree)及执行计划(executionplan)。4、执行sql,返回结果(executeandreturn)软解析(softprase)和硬解析(hardprase)(为了不重复解析相同的SQL语句,在第一次解析之后,OR
3、ACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(systemglobalarea)的共享池(sharedbufferpool)中的内存可以被所有的数据库用户共享.因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径.)Oracle利用内部的hash算法来取得sql的hash值,然后在共享池(sharedbufferpool)里查找是否存在该hash值;假设存在,则将此sql与cache中的进行比较;假设“相同”,就将利用已有的解析树
4、与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。如果上面的2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。Sql语句必须大小写完全一致才可以软解析。创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。绑定变量,共享SQL语句Sql语句必须大小写完全一致才可以共享。使用绑定变量的sql可以共享,使用软解析,降低系统资源的耗用。a中的两组SQL语句是相同的(可以共享),而b中的两组语句是不同的(即使在运行时,赋于不同的绑定变量相同的值
5、)a.selectempnofromempwhereempname=‘AAA’;selectempnofromempwhereempname=‘AAA’;selectpin,namefrompeoplewherepin=:blk1.pin;selectpin,namefrompeoplewherepin=:blk1.pin;b.selectempnofromempwhereempname=‘AAA’;selectEmpNofromEmpwhereEmpName=‘AAA’;selectpin,namefrompeoplewherepin
6、=:blk1.ot_ind;selectpin,namefrompeoplewherepin=:blk1.ov_ind;where条件在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。避免对列的四则运算,特别是where条件的左边,严禁使用运算与函数对列进行处理。比如有些地方substring可以用like代替。in和existsIn里数据项不能太多,200个以下。子查询返回数据相对外围查询多,用exists效率高。子查询返回数据相对外围查询少,用in效率高。在子查询中,NOTIN子
7、句将执行一个内部的排序和合并.无论在哪种情况下,NOTIN都是最低效的(因为它对子查询中的表执行了一个全表遍历).为了避免使用NOTIN,我们可以把它改写成外连接(OuterJoins)或NOTEXISTS.(高效)SELECT*FROMEMP(基础表)WHEREEMPNO>0ANDEXISTS(SELECT‘X'FROMDEPTWHEREDEPT.DEPTNO=EMP.DEPTNOANDLOC=‘MELB')(低效)SELECT*FROMEMP(基础表)WHEREEMPNO>0ANDDEPTNOIN(SELECTDEPTNOFROMDEP
8、TWHERELOC=‘MELB')Or和unionall用UNIONAll替换OR(适用于索引列)通常情况下,用UNIONAll替换WHERE子句中的OR将会起到较好的效果.对索