oracle索引:一种用于提升查询效率的数据库对象。通过快速定位数据的方法,减少磁盘I/O操作。
数据唯一性越高,索引的速度也越快。所以oracle会自动为
主键创建一个索引。
索引信息与表独立存放,这是因为为了减少磁盘的I/O操作。
oracle数据库自动使用和维护索引。
insert,delete的时候索引是自动维护的。
当我们增加,删除的时候,把
hashu.html" target="_blank">二叉树的均衡搞乱了,所以我们要手动维护。手动维护就是·····
索引的分类:
唯一性索引:字段的值是唯一的,它的性能高。
非唯一性索引:
一般查询的数据比较少时,我们就不要用索引了,要查询的数据比较大时,我们用索引性能会更高。
但要把所有的数据都查询出来时,就不要用索引了。
表中的数据是无序的,索引的数据是有序的。
索引优缺点:
优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证
数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间,因为索引是有序的。
缺点:
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护(自动的),降低了数据的维护速度。
创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。
索引里面一般存的是noid。我们找到noid,就可以找到这个noid对应的块。
创建索引的原则:
1.在select操作占大部分的表上创建索引;
2.在where子句中出现最频繁的列上创建索引;
3.在选择性高的列上创建索引(补充索引选择性,最高是1,eg:primary key)(选择性高的也就是唯一性高的)
4.复合索引的主列应该是最有选择性的和where限定条件最常用的列,并以此类推第二列。
5.小于5M的表,最好不要使用索引来查询,表越小,越适合用全表扫描。
复合索引:多个字段组合起来的索引。
建单个索引好还是建复合索引好主要要看字段的唯一性和where条件最常用的列。
六、使用索引的原则
1.查询结果是所有数据行的5%以下时,使用index查询效果最好;
2.where条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引。因为当sql语句所查询的列,
全部都出现在复合索引中时,此时由于 Oracle 只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多;
3.索引利于select,但对经常insert,delte尤其update的表,会降低效率。
4.where 子句中的这个字段,必须是复合索引的第一个字段。
5.where子句中的这个字段,不应该参与任何形式的计算:任何对列的操作都将导致表扫描,它包括数据库函数、
计算
表达式等等,查询时要尽可能将操作移至等号右边。
要查询的数据在10%以上的,则最好用全表扫描。
要查询的数据在5%以上的,使用index查询效果最好。
索引的类型:
1.B树索引。
2.位图索引。
在修改的时候会锁表。
当字段的唯一性太差的时候,就可以用位图索引。
位图索引一般用于
cangku.html" target="_blank">数据仓库,
在线事务处理等地方。最经典的是沃尔玛做的一个数据仓库。
3.函数索引。
delete不可以降低水位。
分页sql:
select * from scott.emp;
select deptno,ename,sal from (
select rownum as rn,deptno,ename,sal from
(select deptno,ename,sal from scott.emp where deptno in(10,20) order by sal desc)
where rownum < =5) where rn>2;
删除重复记录sql:
--删除重复数据:方法一
delete from emp_back where rowid in
(select a.rowid from emp_back a, emp_back b where a.rowid>b.rowid and a.empno=b.empno)
--删除重复数据:方法二
delete from emp_back1 where rowid in
(select max(rowid) from emp_back1 a group by a.empno)
怎么把用exists代替in的sql语句:
SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);
转换成exist语句
SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
怎么把一张表的数据跟新到另一张表:
update emp_back a set comm = (select comm from emp_back1 b where a.empno = b.empno),
sal = (select sal from emp_back1 b where a.empno = b.empno)
物化视图
主要为了提高查询速度,它可以时时更新,也可以定时更新。它是oracle9.2i出来的。它采取的策略就是时间换空间。
oracle分区:
主要是为了提高查询速度,它的原理就是把数据分成几个区存储起来。比如说我们有一亿数据,如果要查某一个时间段的数据,
不采取分区的话,就要在一亿条数据中查找,而我们如果把每个时间段都分成一个区,那么我们就可以在这个时间段的区查找
这条数据。而且我还可以在分区的时候把分区放在不同的磁盘里,这样我们读取数据的时候就可以均匀的在不同磁盘上读取数据,
这样就可以达到I/O均衡。
序列:
取序列当前值:select seq_emp_bak_id.currval from dual;
取序列下一个值:select seq_emp_bak_id.nextval from dual;
怎么在oracle里自动主键的。
使用序列,通过序列自动增长,或者每次把最大主键id的值拿出来加一,或者拿一个表来存储id。
但它们都有缺点:
第一个就是事务回滚它无法恢复,每二个就是事务的问题吧,第三个就是保存id的表也要维护。
oracle里的同义词主要是为了简化操作。
公有同义词:大家都可以用的。
私有同义词:只能自己用,别人不能用。
创建同义词的语句:create synonym emp for scott.emp;
存储过程与函数的区别:
存储过程没有返回值,它一般适合编写一个比较大的功能。它的效率要高,因为存储过程是放在数据库中,所以我们从
内存直接到
数据库库读取的。
函数有返回值,它一般适合编写一个比较小的功能。
要知道怎么写一个简单存储过程和函数。
15309015