Home

hogen

Follow Excellence. Success will chase you.

Home About Github Email

oracle 学习之基础篇(九):序列和索引

序列

什么是序列【Sequence】

  1. 类似于MySQL中的auto_increment自动增长机制,但Oracle中无auto_increment机制
  2. 是oracle提供的一个产生唯一数值型值的机制
  3. 通常用于表的主健值
  4. 序列只能保证唯一,不能保证连续
    【 声明:oracle中,只有rownum永远保持从1开始,且继续】
  5. 序列值,可放于内存,取之较快

为什么oracle不直接用rownum做主健呢?

rownum=1这条记录不能永远唯一表示SMITH这个用户
但主键=1确可以永远唯一表示SMITH这个用户

为什么要用序列

  1. 以前我们为主健设置值,需要人工设置值,容易出错
  2. 以前每张表的主健值,是独立的,不能共享

为 emp 表的 empno 字段,创建序列emp_empno_seq,create sequence 序列名

create sequence emp_empno_seq;

删除序列emp_empno_seq,drop sequence 序列名

drop sequence emp_empno_seq;

查询emp_empno_seq序列的当前值 currval 和下一个值 nextval,第一次使用序列时,必须选用:序列名.nextval

select emp_empno_seq.nextval from dual;
select emp_empno_seq.currval from dual;

使用序列,向 emp 表插入记录,empno 字段使用序列值

insert into emp(empno) values(emp_empno_seq.nextval);
insert into emp(empno) values(emp_empno_seq.nextval);
insert into emp(empno) values(emp_empno_seq.nextval);

修改 emp_empno_seq序列的 increment by属性为20,默认 start with是1,alter sequence 序列名

alter sequence emp_empno_seq increment by 20;

修改修改emp_empno_seq序列的的 increment by 属性为5

alter sequence emp_empno_seq increment by 5;

修改emp_empno_seq序列的 start with 属性

alter sequence emp_empno_seq start with 100;

有了序列后,还能为主健手工设置值吗?

insert into emp(empno) values(9999);
insert into emp(empno) values(7900);

无法对序列做 insert 操作

删除序列,表真正亡,序列亡

索引

什么是索引【Index】

  • 是一种快速查询表中内容的机制,类似于新华字典的目录
  • 运用在表中某个/些字段上,但存储时,独立于表之外

为什么要用索引

  • 通过指针加速Oracle服务器的查询速度
  • 通过rowid快速定位数据的方法,减少磁盘I/O
    【rowid是oracle中唯一确定每张表不同记录的唯一身份证】

rowid的特点

  1. 位于每个表中,但表面上看不见,例如:desc emp是看不见的
  2. 只有在select中,显示写出rowid,方可看见
  3. 它与每个表绑定在一起,表亡,该表的rowid亡,二张表rownum可以相同,但rowid必须是唯一的
  4. rowid是18位大小写加数字混杂体,唯一表代该条记录在DBF文件中的位置
  5. rowid可以参与=/like比较时,用’’单引号将rowid的值包起来,且区分大小写
  6. rowid是联系表与DBF文件的桥梁

索引的特点

  1. 索引一旦建立, Oracle管理系统会对其进行自动维护, 而且由Oracle管理系统决定何时使用索引
  2. 用户不用在查询语句中指定使用哪个索引
  3. 在定义primary key或unique约束后系统自动在相应的列上创建索引
  4. 用户也能按自己的需求,对指定单个字段或多个字段,添加索引

什么时候【要】创建索引

  1. 表经常进行 SELECT 操作
  2. 表很大(记录超多),记录内容分布范围很广
  3. 列名经常在 WHERE 子句或连接条件中出现

    注意:符合上述某一条要求,都可创建索引,创建索引是一个优化问题,同样也是一个策略问题

什么时候【不要】创建索引

  • 表经常进行 INSERT/UPDATE/DELETE 操作
  • 表很小(记录超少)
  • 列名不经常作为连接条件或出现在 WHERE 子句中

    注意:符合上述某一条要求,都可创建索引,创建索引是一个优化问题,同样也是一个策略问题

为 emp 表的 empno 单个字段,创建索引emp_empno_idx,叫单列索引,create index 索引名 on 表名(字段,…)

create index emp_empno_idx on emp(empno);

注意:索引创建后,只有查询表有关,和其它(insert/update/delete)无关,解决速度问题

为 emp 表的 ename,job 多个字段,创建索引emp_ename_job_idx,多列索引/联合索引

create index emp_ename_job on emp(ename,job);

如果在where中只出现job不使用索引

如果在where中只出现ename使用索引

提倡同时出现ename和job

删除emp_empno_idxemp_ename_job_idx索引,drop index 索引名

drop index emp_empno_idx;
drop index emp_ename_job_idx;

hogen

2017-09-23
Home About Github Email