通过分析sql语句的执行计划优化sql二

通过分析sql语句的执行计划优化sql二

ID:35423142

大小:137.50 KB

页数:22页

时间:2019-03-24

通过分析sql语句的执行计划优化sql二_第1页
通过分析sql语句的执行计划优化sql二_第2页
通过分析sql语句的执行计划优化sql二_第3页
通过分析sql语句的执行计划优化sql二_第4页
通过分析sql语句的执行计划优化sql二_第5页
资源描述:

《通过分析sql语句的执行计划优化sql二》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、5.1背景知识      5.2执行计划的步骤及顺序      5.3访问路径(方法)--accesspath      5.4表之间的连接第5章ORACLE的执行计划5.1背景知识:     为了更好的进行下面的内容我们必须了解一些概念性的术语:共享sql语句为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中。这块位于系统全局区域SGA(systemglobalarea)的共享池(sharedbufferpool)中的

2、内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果该语句和之前的执行过的某一语句完全相同,并且之前执行的该语句与其执行计划仍然在内存中存在,则ORACLE就不需要再进行分析,直接得到该语句的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并大大节省了内存的使用。使用这个功能的关键是将执行过的语句尽可能放到内存中,所以这要求有大的共享池(通过设置sharedbufferpool参数值)和尽可能的使用绑定变量的方法执行SQL语句。当你向ORACLE提交一个SQL语句,OR

3、ACLE会首先在共享内存中查找是否有相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。下面是判断SQL语句是否与共享内存中某一SQL相同的步骤:1).对所发出语句的文本串进行hashed。如果hash值与已在共享池中SQL语句的hash值相同,则进行第2步:     2)    将所发出语句的文本串(包括大小写、空白和注释)与在第1步中识别的所有     已存在的SQL语句相比较。     例如:     SELECT*FROMempWHERE

4、empno=1000;     和下列每一个都不同     SELECT*fromempWHEREempno=1000;     SELECT*FROMEMPWHEREempno=1000;     SELECT*FROMempWHEREempno=2000;     在上面的语句中列值都是直接SQL语句中的,今后我们将这类sql成为硬编码SQL     或字面值SQL          使用绑定变量的SQL语句中必须使用相同的名字的绑定变量(bindvariables),例如:     a.该2个sql语句被认为相同

5、     selectpin,namefrompeoplewherepin=:blk1.pin;     selectpin,namefrompeoplewherepin=:blk1.pin;     b.该2个sql语句被认为不相同     selectpin,namefrompeoplewherepin=:blk1.ot_ind;     selectpin,namefrompeoplewherepin=:blk1.ov_ind;     今后我们将上面的这类语句称为绑定变量SQL。     3).将所发出语句中涉

6、及的对象与第2步中识别的已存在语句所涉及对象相比较。       例如:       如用户user1与用户user2下都有EMP表,则       用户user1发出的语句:SELECT*FROMEMP;与       用户user2发出的语句:SELECT*FROMEMP;被认为是不相同的语句,       因为两个语句中引用的EMP不是指同一个表。     4).在SQL语句中使用的捆绑变量的捆绑类型必须一致。     如果语句与当前在共享池中的另一个语句是等同的话,Oracle并不对它进行语法分析。而直接执行该

7、语句,提高了执行效率,因为语法分析比较耗费资源。     注意的是,从oracle8i开始,新引入了一个CURSOR_SHARING参数,该参数的主要目的就是为了解决在编程过程中已大量使用的硬编码SQL问题。因为在实际开发中,很多程序人员为了提高开发速度,而采用类似下面的开发方法:str_sqlstring;int_empnoint;int_empno=2000;str_sql=‘SELECT*FROMempWHEREempno=‘+int_empno;…………int_empno=1000;str_sql=‘SELEC

8、T*FROMempWHEREempno=‘+int_empno;     上面的代码实际上使用了硬编码SQL,使我们不能使用共享SQL的功能,结果是数据库效率不高。但是从上面的2个语句来看,产生的硬编码SQL只是列值不同,其它部分都是相同的,如果仅仅因为列值不同而导致这2个语句不能共享是很可惜的,为了解决这个问题,引入了CURSO

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。