1、选择适合的Oracle优化器(可以通过init.ora里的optimizer_mode来指定)
    Oracle优化器有三种:
      1>RULE
      2>COST
      3>CHOOSE
2、选择最有效率的表名顺序:
      from 后面的表名是从右往左开始解析的,最右边的那张表又叫作基础表。如果有3个以后的表连接查询,就需要选择
   交叉表作为基础表(被其他表引用的表叫交叉表)
3、注意Where子句中的连接顺序(自右往左解析)
4、尽量多用commit
    commit所释放的资源有:
    1>释放回滚段中用户回复数据的信息
    2>释放被程序语句获得的锁
    3>减少Oracle为管理上述三种资源所需的内部花费
5、用exists /not exists 替代 in/not in
6、用索引提高查询效率
      每当有记录在表中增、删、改或索引列被修改时,索引本身也会被修改,这就意味这每条insert、delete、update都会为此
   多付出4、5此的磁盘I/O,但对于select所能得到的巨大好处而言这些都不值得一提(毕竟大多数表执行select语句要比insert、
   update、delete要多的多),有些时候即使你为一个列设置了索引,如果你不注意以下细节,设不设置索引都要进行全表扫描):
     (1)使用不等于操作符(!=、<>) ---可以用or来替代
          说明:
       索引只告诉你什么存在于表中,而不是告诉你什么不存在表中,所以慎用!==
          例(cust_rating上有索引):
        //全表扫描
        select cust_id,cust_name
               from customers
                    where cust_rating <>'aa';
          //高效率
       select cust_id,cust_name
            from customers
                   where cust_rating >'aa' or cust_rating <'aa';
      (2)使用is NULL 或 not is NULL 
            在SQL使用NULL是很麻烦的一件事,在建表时最好把你要设置索引的那个列设置成非空。因为如果被设置索引的列
   在某行有NULL,就不会使用这个索引(除非此索引时位图索引)
      (3)where后使用函数(只为该字段建立了索引,没有建函数索引)
      (4)比较不匹配的数据类型
         列age为字符,并有个索引
         //索引被禁用
           select s.id,s.name 
                  from student s
                        where s.age = 15
        
        改:
           select s.id,s.name
                   from student s
                          where s.age ='15'
       (5)LIKE 的第一个字符为 %  ---这个好理解
       (6)总是使用索引的第一列(多个字段做组合索引时,选用第一个字段)
              如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 
       (7)避免在索引列上计算:
          //低效-索引失效
         select id,name
               from dept
                       where sal *12 >2500
            //高效
         select id,name
                  from   dept
                        where sal >2500/12 ('where sal >=2500/12 + 0.001 ' 会更好)
 7、用'>='替代 '>'
 8、避免在索引列上计算:
    //低效
    select id,name
        from dept
     where sal *12 >2500
    //高效
    select id,name
        from dept
     where sal >2500/12 ('where sal >=2500/12 + 0.001 ' 会更好)
 9、用union替代 or (仅使用与索引列)

解决方案 »

  1.   

    这篇文章的Oracle版本过低。
    优化方法跟Oracle版本有很大关系。参考6项。
    5项不是一定要{exists /not exists 替代 in/not in }的。得看数据分布情况。
    存在就有存在的理由,不是用来被替代的。
      

  2.   

    我记得Tom的书里说不要过多的commit
    谁来解释一下
      

  3.   

    因为COMMIT会引发其他一些系统操作
    如果你频繁的COMMIT会造成资源没必要的消耗当然 也不能过太久COMMIT主要是把握好一个度 呵呵 挺抽象的哦