ORACLE_SQL语句优化资料共享课程.pptVIP

  • 2
  • 0
  • 约1.05万字
  • 约 42页
  • 2016-09-26 发布于江苏
  • 举报
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)

1亿VIP精品文档

相关文档