- 1、本文档共42页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ORACLE SQL语句优化 资料共享 访问Table的方式 ORACLE 采用两种访问表中记录的方式: a. 全表扫描 全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描. b. 通过ROWID访问表 你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高. 删除重复记录 最高效的删除重复记录方法 ( 因为使用了ROWID) DELETE FROM EMP E WHERE E.ROWID (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); 基于索引的SQL语句优化 1. IS NULL 与 IS NOT NULL 2. 联接列 3. 带通配符(%)的like语句 4. Order by语句 5. NOT 6. IN和EXISTS 7.用表连接替换EXISTS 8.用EXISTS替换DISTINCT 9.用WHERE替代ORDER BY 10.用UNION替换OR (适用于索引列) 11.用IN来替换OR 1.IS NULL 与 IS NOT NULL 不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。 任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。 2.联接列 对于有联接的列,即使最后的联接值为一个静态值,优化器不会使用索引的。 select * from employee where first_name||‘ ||last_name =George Bush; 使用索引的语句 Select * From employee where first_name =George and last_name =Bush; select * from employee where first_name = SUBSTR(name,1,INSTR(name, )-1) and last_name = SUBSTR(name,INSTR(name’, )+1) ; 3.带通配符(%)的like语句 通配符(%)在搜寻词首出现,所以Oracle系统不使用的索引 不使用索引的SQL select * from employee where last_name like %Bush%; 使用索引的SQL select * from employee where last_name like c%; 4.Order by语句 Order by语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。 仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。 5.逻辑表达式 NOT 不使用索引 where not (status =VALID) ; where status VALID; where status !=VALID; select * from employee where salary3000; 使用索引 select * from employee where salary3000 or salary3000; 6.IN和EXISTS ... where column in(select * from ... where ...); ... where exists (select X from ...where ...); 通过使用EXISTS,Oracle系统会首先检查主查询,然后运行子查询直到找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这
文档评论(0)