- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
oracle解释计划,耗费
SQL语句性能调整之ORACLE的执行计划【内容导航】 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第1页:背景知识第2页:Rowid的概念第3页:可选择性第4页:执行计划的步骤第5页:访问路径(方法)--accesspath第6页:4种类型的索引扫描第7页:表之间的连接第8页:嵌套循环(NestedLoops,NL)第9页:如何产生执行计划第10页:如何分析执行计划第11页:对于RBO优化器第12页:对于CBO优化器第13页:如何干预执行计划--使用hints提示第14页:使用全套的hints第15页:具体案例分析 文本Tag:Oracle数据库Oracle数据库开发 【IT168技术文档】 背景知识: 为了更好的进行下面的内容我们必须了解一些概念性的术语: 共享sql语句 为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中。这块位于系统全局区域SGA(systemglobalarea)的共享池(sharedbufferpool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果该语句和之前的执行过的某一语句完全相同,并且之前执行的该语句与其执行计划仍然在内存中存在,则ORACLE就不需要再进行分析,直接得到该语句的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并大大节省了内存的使用。使用这个功能的关键是将执行过的语句尽可能放到内存中,所以这要求有大的共享池(通过设置sharedbufferpool参数值)和尽可能的使用绑定变量的方法执行SQL语句。 当你向ORACLE提交一个SQL语句,ORACLE会首先在共享内存中查找是否有相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。 下面是判断SQL语句是否与共享内存中某一SQL相同的步骤: 1).对所发出语句的文本串进行hashed。如果hash值与已在共享池中SQL语句的hash值相同,则进行第2步: 2)将所发出语句的文本串(包括大小写、空白和注释)与在第1步中识别的所有已存在的SQL语句相比较。 例如: SELECT*FROMempWHEREempno=1000; 和下列每一个都不同 SELECT*fromempWHEREempno=1000; SELECT*FROMEMPWHEREempno=1000; SELECT*FROMempWHEREempno=XX; 在上面的语句中列值都是直接SQL语句中的,今后我们将这类sql成为硬编码SQL或字面值SQL 使用绑定变量的SQL语句中必须使用相同的名字的绑定变量(bindvariables),例如: a.该2个sql语句被认为相同 selectpin,namefrompeoplewherepin=:; selectpin,namefrompeoplewherepin=:; b.该2个sql语句被认为不相同 selectpin,namefrompeoplewherepin=:_ind; selectpin,namefrompeoplewherepin=:_ind; 今后我们将上面的这类语句称为绑定变量SQL。 3).将所发出语句中涉及的对象与第2步中识别的已存在语句所涉及对象相比较。例如: 如用户user1与用户user2下都有EMP表,则 用户user1发出的语句:SELECT*FROMEMP;与 用户user2发出的语句:SELECT*FROMEMP;被认为是不相同的语句, 因为两个语句中引用的EMP不是指同一个表。 4).在SQL语句中使用的捆绑变量的捆绑类型必须一致。 如果语句与当前在共享池中的另一个语句是等同的话,Oracle并不对它进行语法分析。而直接执行该语句,提高了执行效率,因为语法分析比较耗费资源。 注意的是,从oracle8i开始,新引入了一个CURSOR_SHARING参数,该参数的主要目的就是为了解决在编程过程中已大量使用的硬编码SQL问题。因为在实际开发中,很多程序人员为了提高开发速度,而采用类似下面的开发方法: str_sqlstring; int_empnoint; int_empno=XX; str_sql=‘SELECT*FROMempWHEREempno=‘+int_empno; ???? in
文档评论(0)