当前位置:首页 > PHP教程 > PHP总结归纳

Oracle查询技巧

1.where子句中的连接顺序:oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾. 2.select子句中避免使用 *:oracle在解析的过程中, 会将'*' 依次转 1. w

  1.where子句中的连接顺序:oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾. 2.select子句中避免使用 ‘ *’:oracle在解析的过程中, 会将'*' 依次转

  1. where子句中的连接顺序:oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾.

  2. select子句中避免使用 ‘ *’:oracle在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

  3. 使用decode函数来减少处理时间:使用decode函数可以避免重复扫描相同记录或重复连接相同的表.

  4. 用truncate替代delete:当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有commit事务,oracle会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用truncate时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: truncate只在删除全表适用,truncate是ddl不是dml)

  5. 尽量多使用commit:只要有可能,在程序中尽量多使用commit, 这样程序的性能得到提高,需求也会因为commit所释放的资源而减少:

  commit所释放的资源:

   回滚段上用于恢复数据的信息.

   被程序语句获得的锁

   redo log buffer 中的空间

   oracle为管理上述3种资源中的内部花费

  6. 使用表的别名(alias):当在sql语句中连接多个表时, 请使用表的别名并把别名前缀于每个column上.这样一来,就可以减少解析的时间并减少那些由column歧义引起的语法错误.

  7. 用exists替代in、用not exists替代not in:在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用exists(或not exists)通常将提高查询的效率. 在子查询中,not in子句将执行一个内部的排序和合并. 无论在哪种情况下,not in都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用not in ,我们可以把它改写成外连接(outer joins)或not exists.

  例子:

  高效:

  select * from emp (基础表) where empno > 0 and exists (select ‘x' from dept where dept.deptno = emp.deptno and loc = ‘melb')

  低效:

  select * from emp (基础表) where empno > 0 and deptno in(select deptno from dept where loc = ‘melb')

  8. 用exists替换distinct:当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在select子句中使用distinct. 一般可以考虑用exist替换, exists 使查询更为迅速,因为rdbms核心模块将在子查询的条件一旦满足后,立刻返回结果。

  例子:

  低效:

  select distinct dept_no,dept_name from dept d , emp e

  where d.dept_no = e.dept_no

  高效:

  select dept_no,dept_name from dept d where exists ( select ‘x'

  from emp e where e.dept_no = d.dept_no);

  9. sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行;

  10. 用where替代order by:

   order by 子句只在两种严格的条件下使用索引.

   order by中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

   order by中所有的列必须定义为非空.

  例如:

  表dept包含以下列:

  dept_code pk not null

  dept_desc not null

  dept_type null

  低效: (索引不被使用)

  select dept_code from dept order by dept_type

  高效: (使用索引)

  select dept_code from dept where dept_type > 0

  11. 优化group by:

  提高group by 语句的效率, 可以通过将不需要的记录在group by 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.

  低效:

  select job , avg(sal)

  from emp

  group job

  having job = ‘president'

  or job = ‘manager'

  高效:

  select job , avg(sal)

  from emp

  where job = ‘president'

  or job = ‘manager'

  group job

.syntaxhighlighter{padding-top:20px;padding-bottom:20px;}
【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!