oracle sql优化技巧

数据库方面一直是自己的薄弱项,现在以本文慢慢积累总结oracle sql优化的一些技巧。

1.首先大家很容易想到的一切优化技巧--索引,索引有啥用?索引在表数据量很大时添加索引确实能加快查询速度,通过索引查询能很好地避免全表扫描。

   但应该也要注意的时这是在数据量较大的时候。同时数据较小时,反而浪费索引空间。另外,添加索引之后数据的插入,更新反而会变慢,在插入或修改记录

 时需要新建索引并排序。

   索引创建语句:

   create [unique] index xxx on A(column 1,column 2)

   关于唯一索引和普通索引这里不得不提一句 唯一索引要求字段值不能重复,而普通索引则不要求

   另外唯一索引与主键:大家都知道主键是使用来表示记录的唯一性,只能有一个字段表示,不允许为空。而唯一索引则可以在多个值唯一的字段上建,且允许为空。

2.大家显而易见避免使用select * 而用select 字段

3.避免在在添加索引的字段使用计算 例如 select * from A where num*2>6;-->优化:select * from B where num>6/2;

4.避免在添加索引的字段使用函数  例如 select * from where B where to_char(num)= 'c';-->若在程序大量此类语句,建议修改索引添加函数

   修改索引字段语句:drop index xxx; create index xxx on B(to_char(num));

5.能使用>=就用 因为>=4会直接定位到4,而>3 会先定位到3 在定位到4

6.使用exist 代替 in 例如:select e.deptno from employee e where e.deptno in(select d.deptno from dept d);

  -->优化:select e.deptno from employee e where exist (select d.deptno from dept d where d.deptno = e.deptno);

7.使用Union all代替 or,num索引字段段在使用or后,将放弃索引引擎而改为全表扫描。 例如:select * from A where num=1 or num=2

  -->优化:select * from A where num = 1 Union all select * from B where num = 2;

8.在数据量很大的时候,除了使用索引也可以用表分区。分散存储,同时分散IO,加快查询。

 表分区语句

   create table A (

   AId varchar2,

    AName varchar2,

    Score  int   

  )

 partition by Score(Score) (

   partition jige values less(maxvalue) tablespace a1,

      partition bujige values less(maxvalue) tablespace a2

 )

 这里顺带提一下创建表空间语句:

 第一步:创建临时表空间

 create temporary tablespace A

 tempfile  'D:\oracledata\a.dbf'

 size 50m 

 autoextend on

 next 50m maxsize 20480m

 extent management local;

第二步:创建表空间

create tablespace B logging

 datafile  'D:\oracledata\b.dbf'

 size 50m 

 autoextend on

 next 50m maxsize 20480m

 extent management local;

9.查询条件能写在where中尽量写在where中 where直接根据条件筛选出数据 而having则是在查找出的数据中再进行筛选。

   这里提一句:select * (5)from B (1) where ...(2) group by (3)  having(4) order by (6) sql语句的处理逻辑

10. 使用 is null 判断将使num索引字段失效 ,建议插入时默认值,然后根据默认值判断。

                   

posted @ 2017-03-22 22:42  kimoyoyo21  阅读(209)  评论(0编辑  收藏  举报