Oracle-序列、索引、同义词

章节目标

  • 通过本章学习,学员应达到如下目标:
    • 理解序列、索引对象的作用及概念;
    • 掌握序列的创建及使用方法;
    • 掌握索引的创建及使用方法;
    • 掌握何时应该创建索引;
    • 了解同义词的概念;

本章内容

序列的概念

  • 序列(SEQUENCE)
    • 序列是按照一定规则能自动增加/减少数字的一种数据库对象。
    • 通常可以使用序列自动地生成主键值。

创建序列

  • 语法:
CREATE SEQUENCE [schema.] sequencename
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
  • sequencename:序列对象的名字

  • INCREMENT BY n:序列连续两个值之间的间隔n,默认为1。

  • START WITH n :序列起始值n,该项省略,起始值为1

  • MAXVALUE n :序列最大值;NOMAXVALUE :指定序列无最大值

  • MINVALUE n :序列最小值;NOMINVALUE :指定序列无最小值

  • CYCLE|NOCYCLE:表示序列在达到最大值或最小值之后是否继续产生序列值,NOCYLE表示不再产生,NOCYLE是默认选项。

  • CACHE n|NOCACHE:表示序列值被服务器预先分配并存储在内存中,NOCACHE表示不预先分配并存储,CACHE 20是默认选项

  • 例:创建序列test_seq,起始值为10,每次增长2,最大值100,最小值9,循环序列,每次缓存10

CREATE SEQUENCE test_seq
START WITH 10        --序列从10开始
INCREMENT BY 2     --序列每次增加2
MAXVALUE 100        --序列最大值100
MINVALUE 9          --序列最小值9
CYCLE             --序列循环,每次增加2,一直到100后回到9从新开始
CACHE 10;         --缓存中序列值个数为10

序列属性

  • NEXTVAL和CURRVAL伪列
    • CURRVAL:表示序列返回的当前值;
    • NEXTVAL:表示序列返回的下一个值;
    • CURRVAL在被引用之前,必须先使用NEXTVAL来产生一个序列值;
    • 可用语句 序列名.CURRVAL或 序列名.NEXTVAL来访问序列;
  • NEXTVAL和CURRVAL伪列
    • 您可以在下列情况使用NEXTVAL 和 CURRVAL:
      • SELECT 语句的SELECT列表中,但不包括子查询中的SELECT语句
      • INSERT 语句中的子查询SELECT列表中
      • INSERT 语句的VALUES子句中
      • UPDATE 语句的SET子句中
    • 下列情况不能使用 NEXTVAL 和 CURRVAL:
      • 在视图的SELECT列表中
      • 包含DISTINCT关键字的 SELECT语句中
      • 含有 GROUP BY, HAVING, ORDER BY子句的SELECT语句中
      • SELECT, DELETE, UPDATE 语句的子查询中
      • 含有 DEFAULT表达式的 CREATE TABLE、 ALTER TABLE 语句中

使用序列

  • 序列的使用
    • 创建序列student_seq:
CREATE SEQUENCE student_seq
START WITH 10000 
INCREMENT BY 1;
  • 使用序列student_seq生成student表中sid列插入值:
INSERT INTO student 
VALUES (student_seq.NEXTVAL, 'Scott', 'Computer Science', 11);
  • 查看student_seq序列当前值:
SELECT student_seq.CURRVAL FROM dual;

修序序列

  • 修改序列的语法如下:
ALTER  SEQUENCE  [schema.]sequencename
        [INCREMENT BY n]
        [MAXVALUE n | NOMAXVALUE]
        [MINVALUE n | NOMINVALUE]
        [CYCLE | NOCYCLE]
        [CACHE n | NOCACHE];
  • 修改序列的语法没有START WITH子句。

  • 修改序列

    • 正确修改
ALTER SEQUENCE test_seq
INCREMENT BY 4    ——序列每次增加4
MAXVALUE 1000     ——序列最大值1000
NOCACHE;         ——不设定缓存
  • 错误修改
ALTER SEQUENCE test_seq
INCREMENT BY 4    
MAXVALUE 100       ——最大值100小于已经分配的序列值200
NOCACHE; 

删除序列

  • 删除序列的语法如下:
DROP SEQUENCE [schema.]sequencename;
  • 例:删除序列student_seq
DROP SEQUENCE student_seq;

ROWID

  • ROWID
    • 是一个伪列,系统自动产生。
    • ROWID能唯一标示每一条数据库行记录的物理地址,通过 ROWID 能快速定位到一条行记录。
SELECT rowid,ename
FROM emp;
ROWID ENAME
AAAMfPAAEAAAAAgAAA SMITH
AAAMfPAAEAAAAAgAAB ALLEN
  • ROWID的格式
例: AAAHjXAAOAAAADaAAA
数据对象编号  文件编号    块编号       行编号
AAAHjX         AAO      AAAADa       AAA
ROWID ENAME
AAAHjXAAOAAAADaAAA SMITH
AAAHjXAAOAAAADaAAC ALLEN
  • ROWID的应用
    • 快速定位记录,使用ROWID检索及操作数据,效率最快
例:使用ROWID修改数据
    UPDATE emp
    SET    ename = ename || '*'
    WHERE ROWID = 'AAAMg6AAFAAAABUAAA';

索引概念

  • 索引( INDEX ):
    • 是对数据库表中一个或多个列的值进行排序的一种数据库对象。
    • 在数据库中,通过索引可以加速对表的查询速度;

索引类别

  • 单列索引:
    • 索引建立在表中的某一列上
  • 复合索引:
    • 索引建立在表中某几列的组合上

创建索引

  • 两种方式:

    • 自动创建: 当有 PRIMARY KEY 或者 UNIQUE 约束时,数据库会自动创建一个索引;
    • 手动创建: 用户使用创建索引语法来进行创建;
      • 创建索引语法:
CREATE INDEX indexname
ON table (column[, column]...);
  • 建议索引命名格式:idx_tablename_columnname

  • 例:在emp表的ename字段上创建索引.

CREATE INDEX    idx_emp_ename
ON  emp (ename);
  • 例:在emp表的deptno和job的组合上创建索引
CREATE INDEX    idx_emp_deptnojob
ON  emp (deptno,job);

测试索引

  • 创建测试环境表
CREATE TABLE e1 AS SELECT * FROM emp;
INSERT INTO e1 SELECT * FROM e1;--多次运行 
UPDATE e1 SET empno=ROWNUM;  --更新所有记录的empno,
                    --以使其数值唯一
commit;--提交
  • 测试无索引检索时间。
SELECT ename,sal FROM e1
WHERE empno=210000; 
  • 测试建索引后检索时间。
CREATE INDEX e1_id ON e1(empno); --创建索引
SELECT ename,sal FROM e1
WHERE empno=210000; --再次在有索引的情况下做测试

适合创建索引情况

  • 表数据量很大
  • 要查询的结果集在2%-4%左右
  • 经常用来做WHERE条件中的列或者多表连接的列
  • 查询列的数据范围分布很广
  • 查询列中包含大量的NULL值,因为空值不包含在索引中

不适合创建索引情况

  • 数据量很小的表
  • 在查询中不常用来作为查询条件的列
  • 频繁更新的表
  • 索引列作为表达式的一部分被使用时,比如常查询的条件是SALARY*12,此时在SALARY列上创建索引是没有效果的
  • 查询条件中有单行函数时,用不上索引

索引缺点

  • 占用空间;
  • 降低DML的操作速度;

删除索引

  • 删除索引的语法
DROP INDEX index;
  • 删除索引后,索引中的数据及定义被删除,索引所占的数据空间被释放,但表中的数据仍然存在。

相关数据字典

  • USER_INDEXES 数据字典视图包含索引的名称及其唯一性;
  • USER_IND_COLUMNS数据字典视图包含索引名称、表名以及列名;
SQL> SELECT ic.index_name, ic.column_name,
  2     ic.column_position col_pos,ix.uniqueness
  3  FROM   user_indexes ix, user_ind_columns ic
  4  WHERE  ic.index_name = ix.index_name
  5  AND        ic.table_name = 'EMP';

同义词

  • 同义词的概念
    • 同义词( SYNONYM )

      • 是指向数据库对象(如:表、视图、序列、存储过程等)的数据库指针。
    • 使用同义词好处:

      • 可以简化对数据库对象的访问;
      • 方便对其他用户表的访问;
      • 简化过长的对象名称;
      • 节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;
      • 扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;
      • 同义词可以创建在不同一个数据库服务器上,通过网络实现连接;
  • 创建同义词
    • 创建同义词的语法如下:
CREATE [PUBLIC] SYNONYM 同义词 
FOR  [schema.]对象名;
  • 同义词两种类型:

    • 私有(PRIVATE)。是在指定的方案中创建的,并且只允许拥有它的方案访问
    • 公有(PUBLIC)。由PUBLIC方案所拥有,所有的数据库方案都可以引用他们。
  • 删除同义词

    • 创建employees表的别名。
CREATE SYNONYM  s_emp
FOR  hr.employees;
  • 删除同义词。
DROP SYNONYM s_emp;
  • 只有数据库管理员才拥有公有同义词的创建和删除权限。

本章重点总结

  • 理解序列、索引对象的作用及概念;
  • 掌握序列的创建及使用方法;
  • 掌握索引的创建及使用方法;
  • 掌握何时应该创建索引;
  • 了解同义词的概念;

分割线


博主为咯学编程:父母不同意学编程,现已断绝关系;恋人不同意学编程,现已分手;亲戚不同意学编程,现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏,金额不限。。。

你可能感兴趣的:(Oracle-序列、索引、同义词)