Oracle之索引、视图和序列

索引、视图和序列

1、索引

  • 索引:类似于书的目录,提高查询效率

创建索引

create index index_name on table_name(col_name[,col_name,...]);

index:索引关键字
index_name:索引名称
table_name:表名
col_name:索引列名
  • 索引它并不是在所有情况下都会优化查询,它是在大量数据查询时,每次查询的数据量在表的总数据量30%以下时,会提高效率
  • 索引会提高查询效率,但时会降低添加和修改的执行效率
  • 索引一般是给增删改操作比较少的表上建

索引分类

  • 单列索引:给某个列建一个索引,叫单行索引
  • 联合索引:给多个列建一个索引,叫联合索引,如果联合索引,在查询是,使用了第一个索引列作为条件,那么它会使用索引提高查询效率,如果使用了非第一个索引列作为条件,它不会使用索引

注意:在使用索引列作为查询条件时,不要在索引列上进行数学运算

索引在逻辑上和物理上都于相关的表和数据无关,创建和删除索引,都不会影响基本的表,都不会影响SQL语句的语法

原理

如果我们没有索引,搜索 name=‘scott’ ,需要检索所有的记录,给 name 字段加上索引,Oracle 就会对全表进行一次搜索,将每条记录的 name 值进行升序排序,然后构建索引条目,存储在索引段中,搜索 name=‘scott’ ,直接找索引排序后的结果

create index index_emp_sal on emp(sal);
-- 这样写条件不会使用索引
select * from emp where sal*12>10000;
-- 这样它就会使用索引
select * from emp where sal>10000/12;

删除索引

drop index index_name;

drop index index_emp_sal;

2、视图

  • 视图以经过定制的方式显示来自一个或多个表的数据
  • 视图可以视为“虚拟表”或存储的查询
  • 创建视图所依据的表称为基表

视图的优点

  • 提供了另外一种级别的表安全性
  • 隐藏了数据的复杂性
  • 简化的用户的SQL命令
  • 隔离基表结构的改变
  • 通过重命名列,从另一个角度提供数据

创建视图

create [or replace] [force] view view_name [(alias[,alias,...])] as select_statement
[with check option]
[with read only]

-- 授予scott用户创建视图的权限
grant create view to scott;
  • view:视图关键字
  • or replace:如果视图已经存在,则替换旧视图
  • force:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用
  • view_name:视图名称,符合标识符命名规范
  • alias:别名,别名的数量要和后面的查询语句的列相同
  • with check option:子句可以保证让你只能在视图的==条件之内(where后的擦好像条件)==对视图进行DML
  • with read only:表示是一个只读视图
create view view_dept_emp as select e.*,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;

注意:创建视图中可以使用单行函数、分组函数和表达式,但必须为使用的函数或者表达式的字段指定名字

视图上的DML语句的限制:

  • 只能修改一个底层的基表(也就是键保留表)
  • 如果修改违反了基表的约束条件,则无法更新视图
  • 如果视图包含连接操作符、DISTINCT关键字、集合操作符、聚合函数或group by 子句,则无法更新视图
  • 如果视图包含伪劣或表达式,则无法更新视图
  • 复杂视图中,可以更新键保留表的列(单表和视图都可以作为主键的列所在的表),不可以更新非键保留表的列

3、序列

  • 序列:是Oracle中自动生成一个序列的对象,一般用来生成表的主键的值

创建序列

create sequence sequence_name
	start with startValue
	increment by inrValue
	minvalue minValue
	maxvalue maxValue
	cache|nocache
	cycle|no cycle
  • sequenct:序列关键字
  • sequenct_name:序列名称
  • start with startValue:指定序列的初始值,startValue是一个自然数
  • increment by inrValue:指定序列的值每次增加多少,inrValue是一个自然数
  • minvalue:指定序列最小值,minValue是一个自然数
  • maxvalue:指定序列最大值,maxValue是一个自然数
  • cache|no cache:指定序列缓存,默认缓存20个。oracle会预先在内存中放置一组指定大小的序列,当使用完这些序列后再生成下一组,这样会存取得快些,但当数据库关闭等情况时,下一次再生成序列时可能会使序列间断,不是一串连续的号,当不是特别需要连续的序列时最好指定
  • cycle|no cycle:指定序列是否循环生成
-- 创建序列
create sequence my_seq start with 1 increment by 1
-- 取值
select my_seq.nextval from dual;
select my_seq.currval from dual;

-- 使用案例
insert into tablename values(my_seq.nextval,value1,value2,...)
  • nextval:取序列的值,并且序列的值增加
  • currval:取序列的当前值,序列值不会变

修改序列

  • 不能更改序列的start with 参数
alter sequenct my_seq maxvalue 5000 cycle;

删除序列

drop sequence my_seq;

4、主键生成策略

  1. 数字自增长序列方式

    Oracle 中使用 sequence,mysql 使用自增长选项即可实现

    • 优点:简单、性能不错、分页排序都容易
    • 缺点:不同数据库生成方式不统一,进行数据库迁移时,要特殊处理。多台机器组成主从集群时,要特殊处理,设置好起始和步长,包括分库分表
  2. UUID universally unique identifier

    生成时会调用本机的网卡地址,芯片id码,纳秒级的时间还有其他数字混合生成,大部分生成在各个平台或者编程语言自带。

    • 优点:不冲突,使用简单,数据合并时候,或者分库分表以及微服务架构都不会冲突
    • 缺点:空间使用比较大,传输数据量大,无法排序,字符串类型,无异议
  3. 自研的生成策略

    Twitter的snowflake算法

    • 优点:不依赖与数据库,灵活方便,id也是唯一且自增的数字
    • 缺点:数据库内部不方便使用,要用到一些编程语言辅助生成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值