oracle优化

1.没有将表数据和索引数据存储到不同的表空间中,而不加区别地将它们存储到同一表空间里。这样,不但会造成I/O竞争,也为数据库的维护工作带来不便。
2.索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率
。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引
的使用要恰到好处,其使用原则如下:  
在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连
接的字段则由优化器自动生成索引。  
在频繁进行排序或分组(即进行group   by或order   by操作)的列
上建立索引。  
在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少
的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女
”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查
询效率,反而会严重降低更新速度。  

建立索引语法
     CREATE  [UNIQUE] INDEX 索引名 ON 表名 (列名)     TABLESPACE 表空间名
3.把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避
免多重排序操作,而且在其他方面还能简化优化器的工作。例如:  
SELECT   cust.name,rcvbles.balance,……other   columns  
FROM   cust,rcvbles  
WHERE   cust.customer_id   =   rcvlbes.customer_id  
AND   rcvblls.balance> 0  
AND   cust.postcode> “98000”  
ORDER   BY   cust.name
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出
来放在一个临时文件中,并按客户的名字进行排序:  
SELECT   cust.name,rcvbles.balance,……other   columns  
FROM   cust,rcvbles  
WHERE   cust.customer_id   =   rcvlbes.customer_id  
AND   rcvblls.balance> 0  
ORDER   BY   cust.name  
INTO   TEMP   cust_with_balance
然后在临时表中查询:   SELECT   *   FROM   cust_with_balance   WHERE   postcode> “98000”
4.如果使用null值判断将导致引擎放弃使用索引而进行全表扫描如:
select   id  from t   where  num  is  null;
在这种情况下可以将num默认值设为0,确保表中没有null值,
  然后:select  id  from  t  where  num =0;
  如果是varchar2型的话可以根据情况设定默认值,
  这样避免了全表的扫描。
5.通配符‘%’当通配符出现在搜索词首时,Oracle优化器不使用索引。
Select   *   from   employee   where   name   like   ‘%Z%’;
Select   *   from   employee   where   name   like   ‘Z%’;
第二句的执行效率会比第一句快,但查询结果集可能会不同。

DISTINCT总是建立一个排序,所以查询速度也慢。
使用它时就不要用GROUP  BY

In 和not   in 也要少使用,使用in 使系统无法索引,只能直接搜索
select   id   from   t   where    num    in(1,2,3);
对于连续的数字,使用between:
select  id   from   t   where   num   between  1  and   3;
有时可以使用exists代替in

避免在where 后面出现表达式
Select  id   from   t   wherer  num/2=20;
应该改为:Select   id   from   t   where   num=20*2
6.create table t_partition_range (id number,name varchar2(50))  2 partition by range(id)( 3 partition t_range_p1 values less than (10) tablespace tbspart01, 4 partition t_range_p2 values less than (20) tablespace tbspart02, 5 partition t_range_p3 values less than (30) tablespace tbspart03, 6 partition t_range_pmax values less than (maxvalue) tablespace tbspart04 7 );

只有在建立了分区表之后才能建立分区索引
create index idx_parti_range_id on t_partition_range(id) 2 global partition by range(id)( 3 partition i_range_p1 values less than (10) tablespace tbspart01, 4 partition i_range_p2 values less than (40) tablespace tbspart02, 5 partition i_range_pmax values less than (maxvalue) tablespace tbspart03);
7.普通索引 SQL > CREATE INDEX INDEX_NAME ON TABLE (COLUMN) local ( partition part_idx_01 tablespace index_space01, partition part_idx_02 tablespace index_space02, partition part_idx_03 tablespace index_space03 ) 2.唯一索引 如:主键 SQL > CREATE UNIQUE INDEX INDEX_NAME ON TABLE (COLUMN) local ( partition part_idx_01 tablespace index_space01, partition part_idx_02 tablespace index_space02, partition part_idx_03 tablespace index_space03 )
8.SQL > CREATE [UNIQUE] INDEX INDEX_NAME ON TABLE(COLUMN) global partition by range(column) ( partition part_idx_01 value less than(first range value) tablespace index_space01, partition part_idx_02 value less than(second range value) tablespace index_space02, partition part_idx_03 value less than(maxvalue) tablespace index_space03 )
   当对大数据量进行并发操作时,可能根据字段建立分区索引
   如时间:可根据月份或者年份建立分区索引,这样查询时只查分区,而不需要
   扫描全表
     1.分区字段不是主键的情况下,只可以创建全局分区索引,不可以创建本地主键分区索引. 只有分区字段为主键时才可以创建本地主键分区索引. 2.如果创建本地唯一分区索引,除指定索引字段外还要加上表分区字段. 这种索引意义不大:因为这样构成复合索引,索引改变,约束也改变了. 3.如果创建非唯一索引则不需要表分区字段. 4.创建全局分区索引后可以创建约束.
9.以上的东西是我在百度文库看到的,觉得写得很好,就抄录下来了,以供自己以后学习!


你可能感兴趣的:(oracle)