高效SQL语句浅析.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SQL优化策略 SQL优化 脚本的几个注意点 SQL执行计划 共享sql语句 Oracle将用户提交的SQL语句进行解析,然后将执行计划放在内存(系统全局区SGA)中,这样可以减少对相同sql语句的重复解析。 判断过程:1、对文本串计算hashed值比较;2、语句所涉及的对象比较。 Rowid的概念 Rowid是访问表中的给定的行的最快的访问方法,通过ROWID可以直接定位到相应的数据块上,然后将其读到内存。(索引也是通过rowid快速访问数据) Recursive SQL概念 为了执行用户发出的一个sql语句,Oracle必须执行一些额外的语句。比如当我们发送一个DDL请求时,oracle会隐含的执行RecursiveSql来修改相关的数据字典信息 Row Source(行源) 相当于SQL操作的中间结果,比如上一操作返回的符合条件的行的集合(可以是表的全部行数据或者部分行数据) Driving Table(驱动表) 即前面说的基础表,我们应该尽量使用在应用查询的限制条件后,返回较少行源的表作为驱动表。 SQL执行计划 Probed Table(被探查表) 即被驱动的内层表,一般该表较大并且相应被驱动关联的列上应该有索引。 访问路径(方法) (accesspath) 优化器在形成执行计划时需要做的一个重要选择是如何从数据库查询出需要的数据。对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据,优化器会选择最优路径。(数据库块是最小的IO单位,即使只读一行数据,也会将整块的数据读到内存中) 1)全表扫描(FullTableScans,FTS) Oracle会顺序分配给表的每个数据块,直到最高水平线(HWM)。 使用FTS的前提条件:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过总量的5%--10%,或你想使用并行查询功能时。 2)通过ROWID的表存取(TableAccessbyROWID或rowidlookup) 3)索引扫描(IndexScan或indexlookup) 一次I/O只能读取一个数据块 表之间的连接 表之间的连接顺序对于查询的效率有非常大的影响,一般以较小的rowsource来驱动较大的rowsource. 嵌套循环(NestedLoops,NL) 哈希连接(HashJoin,HJ) SQL优化原则 选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表)将被最先处理,在FROM子句中包含多个表的情况下,尽量选择记录条数最少的表作为基础表。 WHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接应该写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件应该写在WHERE子句的末尾。 SELECT子句中避免使用*‘ Oracle在解析的时候会通过查询数据字典,将‘*’转换成所有的列,所以尽量只写我们所需要的字段列。 多表连接时,尽量使用表的别名(Alias) 当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。 用EXISTS替代IN、用NOT EXISTS替代NOT IN 使用Not in 或者 in时,子句 内部会先执行一个全表遍历,效率较低。使用exists会直接关联匹配并返回满足条件的记录。 删除表全部记录 delete删除指定条件的数据,删除的数据会记录在滚回段,可恢复,速度慢; truncate删除整个表的数据,不可恢复,速度快(直接重置HWM) 减少对表的查询 在含有子查询的SQL语句中,要特别注意减少对表的查询. 例如: 低效 SELECT TAB_NAME FROM TABLES WHERE TAB_NAME = ( SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION = 604) AND DB_VER= ( SELECT DB_VER FROM TAB_COLUMNS WHERE VERSION = 604) 高效 SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER) FROM TAB_COLUMNS WHERE VERSION = 604) Update 多个Column 例子: 低效: U

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档