11OracleSQL性能优化.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
11OracleSQL性能优化

使用提示(Hints) * FULL hint 告诉ORACLE使用全表扫描的方式访问指定表。 ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表。 CACHE hint 来告诉优化器把查询结果数据保留在SGA中。 INDEX Hint 告诉ORACLE使用基于索引的扫描方式。 其他的Oracle Hints * ALL_ROWS FIRST_ROWS RULE USE_NL USE_MERGE USE_HASH 等等。 这是一个很有技巧性的工作。我建议只针对特定的,少数的SQL进行hint的优化。我们也不用对它进行伤脑筋的分析,把它交给工具(LECCO SQL Expert Pro for Oracle)分析。 使用UNION ALL替代UNION * 当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。 如果用UNION ALL替代UNION,这样排序就不是必要了,效率就会因此得到提高。 由于UNION ALL的结果没有经过排序,而且不过滤重复的记录,因此是否进行替换需要根据业务需求而定。 分离表和索引 * 总是将你的表和索引建立在不同的表空间内(TABLESPACES)。 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里。 确保数据表空间和索引表空间置于不同的硬盘上。 * Thank you! 第十一章 Oracle SQL性能优化 SQL语句执行步骤 * 语义分析 视图转换 表达式转换 语法分析 选择优化器 选择连接方式 选择连接顺序 选择数据的搜索路径 运行“执行计划” 访问Table的方式 全表扫描 全表扫描就是顺序地访问表中每条记录,ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描 通过ROWID访问表 ROWID包含了表中记录的物理位置信息,ORACLE采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系,通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高 * 共享 SQL 语句 Oracle提供对执行过的SQL语句进行高速缓冲的机制。被解析过并且确定了执行路径的SQL语句存放在SGA的共享池中。 Oracle执行一个SQL语句之前每次先从SGA共享池中查找是否有缓冲的SQL语句,如果有则直接执行该SQL语句。 可以通过适当调整SGA共享池大小来达到提高Oracle执行性能的目的。 * 选择最有效率的表名顺序(1) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理 当ORACLE处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并. 只在基于规则的优化器中有效 * 选择最有效率的表名顺序(2) 表 train_service_tab 342 条记录 表 train_city_tab 10 条记录 选择train_city_tab作为基础表 (最好的方法) select count(*) from train_service_tab,train_city_tab 执行时间0.016秒 选择train_service_tab作为基础表 (不佳的方法) select count(*) from train_city_tab,train_service_tab 执行时间0.032秒 * 选择最有效率的表名顺序(3) * 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. SELECT * FROM LOCATION L, CATEGORY C, EMP E WHERE E.EMP_NO BETWEEN 1000 AND 2000 AND E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN 将比下列SQL更有效率 SELECT * FROM EMP E, LOCATION L, CATEGORY C WHERE E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN

文档评论(0)

juhui05 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档