Oracle [索引,视图,序列,同义词,事务,锁,数据字典]

目录

一、索引

索引分类

索引建立原则

二、视图

权限

三、序列

主键自生

四、同义词

五、事务

属性( ACID )

六、锁

七、数据字典

动态性能视图


一、索引

在查询的时候,经常被用来做为查询的字段,应该添加索引

1.用于加快数据的检索,类似于书的目录,提高查询效率,优化查询
在数据库中索引可以减少数据库程序查询结果时需要读取的数据量 = 看书通过书的目录来查找想要的内容
2.索引是建立在表上的可选对象
索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式 = 提高效率
3.当创建或者删除一个索引时,不会影响基本的表
4.索引一旦建立,在表上进行DML操作时,oracle会自动管理索引
(执行插入、修改、删除相关操作时)
5.索引对用户是透明的,无论表上是否有索引,sql语句的用法不变
6.oracle创建主键时会自动在该列上创建索

缺点:影响执行效率

索引分类

1. B树索引(默认索引) 保存排序过的索引列和对应的rowid值
oracle中最常用的索引

* 能够适应精确查询、模糊查询和比较查询
* 不管查询条件怎样,查询速度基本相同
* B树索引是基于二叉树结构的;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID值


列基数大时适合使用B数索引
列基数:列不重复值的个数
(名字=基数大 | 性别=基数小)

A表中有10条数据,查询id为8的数据,
创建索引后,那么会先判断 ID = 8

1. 属于 1-5 还是 6-10 ,
2. 进入 6-10 后,再判断输入 6 还是 7-8 还是 9-10,
3. 进入 7-8,拿到 id=8的数据。 只需要查询3次

创建
Oracle会自动为主键和唯一键创建索引
--create table t(id number(3)primary key)
手动自己创建
create index 索引名称 on 表名 (列名);
create index inx_a_name on a(name);

删除 --自动生成的不能删
drop index 索引名;

2. 位图索引
创建位图索引时,oracle会扫描整张表
并为索引列的每个取值建立一个位图
最后通过位图索引中的映射函数完成位到行的rowid的转换
(表中每一行使用(bit,0或者1)来标识该行是否包含该位图的索引列的取值)如果为1,表示对应的rowid所在的记录包含该位图索引列值

基数小的列适合建立位图索引

create bitmap index index_sno on student(sno);

3.单列索引和复合索引(基于多个列创建)
即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

4. 函数索引
  1.当经常要访问一些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度
  2.函数索引既可以使用B树索引,也可以使用位图索引
  (当函数结果不确定时采用B树索引,结果是固定的某几个值时使用位图索引)
  3.函数索引中可以用len、trim、substr、upper(每行返回独立结果),不能使用如sum、max、min、avg等

create  index fbi  on student (upper(name));
select * from student where upper(name) ='TOM';

注意!!!!!!

索引一般是给增删改操作比较少表上建
尽量不要在索引列上进行数学运算,会导致索引失效

索引建立原则

1. 如果有两个或者以上的索引,其中有一个唯一性索引,而其它是非唯一
oracle将使用唯一性索引而完全忽略非唯一性索引
2. 至少要包含组合索引的第一列
即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引
3. 小表不要建立索引  
4. 对于基数大的列适合建立B树索引,对于基数小的列适合建立位图索引
5. 列中有很多空值,但经常查询该列上非空记录时应该建立索引
6. 经常进行连接查询的列应该创建索引
7.限制表中索引的数量

创建索引耗费时间,并且随数据量的增大而增大;
索引会占用物理空间;
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

二、视图

子查询就是一个视图 == 命名的查询
访问视图与表的访问方式一样
视图也就是虚表

优点:
1、可以限制用户对数据的访问
让用户通过视图可以看到表中的一部分数据
2、可以使复杂的查询变得简单
3、提供了数据的独立性,用户不知道数据来源处,隐藏数据来源
4、提供了对相同数据的不同显示
注意
1.对原表进行增删改也会影响视图,因为数据来源于这个表
2.查询结果出现重复列名的时候,不能创建
( 需要用别名,将每个列都查询出来 或者相同的列只显示一个)

WITH READ ONLY:表示是一个只读视图

创建视图 --任何有效的查询语句都可以作为视图
create view 名字 as 查询语句;

替换
-- or replace:如果存在,替换旧视图。
create or replace view vv as select * from a;

删除
drop view 视图名字; -- 删除视图不会影响原来的数据。

-- 命令行窗口模式下查看表和视图的结构
desc 表名;
desc 视图名;
-- 查询每个人的工资(sal+comm)把工资先计算出来做成视图,以后就只要在视图中查询就行
create or replace view vv
as
select a.name, a.id, a.age,a.number, a.sal, b.sex, sal+nvl(comm,0) 工资 from a,b 
where a.id = b.id;
-- 那么我以后查询年薪的时候就可以从视图中查询了
select 工资 from vv;


权限

grant view to scott;
-- 直接赋值dba权限给用户
grant dba to scott;
-- 只赋值创建视图的权限
grant create view to scott;
视图一般用于查询,不建议DML操作
1.如果违反原来表的约束条件,就不能更新
2.如果视图中包含链接操作符、distnct关键字、聚合函数、集合操作符或group by 子查询的时候,不能更新
3.如果视图存在伪劣的时候,则不能更新

-- with read only 创建只读视图,不能执行DML操作
create or replace view vv
as
select * from a
with read only;
with check option; -- 需要对视图进行DML操作时,改为with check option


三、序列

oracle中自动生成一个序列的对象
实现主键自生

创建序列语法:
create sequence seq
    start with 1 #指定序列的初始值
    increment by 1 #每次增加多少 每次加1
    minvalue  #最小值 
    #执行完最大值返回到最小值接着执行 有循环的时候
    maxvalue 60 #最大值 (就到60)
    cache|nocache #指定序列缓存,默认20个
    cycle|no cycle #是否循环生成
    
修改
alter sequence seq maxvalue 2222 #不能改初始值
删除
drop sequence seq;

属性
nextval:取序列的值,并且序列的值增加
select seq.nextval from dual;
insert into a values(seq.nextval);
/*
关闭延迟技术
alter system deferred_seqment_creation=false;
*/
currval:取序列的当前值,序列值不会变
select seq.currval from dual; --不能直接取当前值


主键自生

主键自增
create sequence seq 
start with 1 increment by 1; --永久保存
insert into a values (seq,nextval);


四、同义词

对数据库对象的一个别名
简化访问,缩短对象名称长度
用户不知道数据的最终来源
创建可以一直使用,永久存在

create or replace synonym syn for a;
select * from 用户名.syn;
权限
grant create any synonym to 用户名;
删除
drop synonym syn;
/*
两种类型
公有同义词可被所有的数据库用户访问
私有同义词只能在其模式内访问,且不能与当前模式的对象同名。
*/


五、事务

事务(TRANSACTION)
是作为单个逻辑工作单元执行的一系列操作。这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。
事务是一个不可分割的工作逻辑单元。

银行转钱

属性( ACID )

原子性(Atomicity)
事务是一个完整的操作。事务的各步操作是不可分的。要么都执行,要么都不执行

一致性(Consistency)
当事务完成时,数据必须处于一致状态

隔离性(Isolation)
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

永久性(Durability)
事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

事务提交:commit
事务回滚:rollback
声明保存点:savepoint

insert into a values (1,2,3);
savepoint s1; 
rollback to s1; --回滚s1的地方
/*
create、drop、grant等操作事务是自动提交
每一个insert、update、delete执行后都会提交到数据库
*/
sqlplus命令
show autocommit; --查看事务状态
set autocommit;  --打开事务的自动提交
set autocommit off; --关闭事务的自动提交

六、锁

数据库用来控制共享资源并发访问的机制。

锁用于保护正在被修改的数据
直到提交或回滚了事务之后,其他用户才可以更新数据

select * from v$lock; --sid进程号
select sid,serial# from v$session where sid = ;
alter system kill session 'sid,serial#' ;
行级锁是一种排他锁,防止其他事务修改此行
在使用以下语句时,
Oracle会自动应用行级锁:
UPDATE、
DELETE、
SELECT … FOR UPDATE

SELECT … FOR UPDATE[WAIT n | NOWAIT]语句允许用户一次锁定多条记录进行更新
使用COMMIT或ROLLBACK语句释放锁

锁定整个表,限制其他用户对表的访问

使用命令显示的锁定表,应用表级锁的语法是:
LOCK TABLE table_name IN  MODE;

行共享 (ROW SHARE) – 禁止排他锁定表
行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁
共享锁(SHARE)
锁定表,仅允许其他用户查询表中的行
禁止其他用户插入、更新和删除行
多个用户可以同时在同一个表上应用此锁
共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁
排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表


七、数据字典

记录了数据库的最基本的信息。
数据字典包括数据字典基本表和数据字典视图

USER_ 类型的视图表示当前登录用户拥有的信息。
select * from user_tables;
ALL_ 类型的视图表示当前登录用户有权限看到的信息。
DBA_ 类型的视图表示数据库管理员能够看到的信息,也就是整个数据库范围内的信息。

当前用户
表字段字典视图
select * from user_tab_cols;--用户里面所有的表的列名
用户对象字典视图
select * from user_objects;--用户里创建的所有东西
select * from user_tablespaces;--表空间

动态性能视图


存储数据库中每时每刻都在变化的信息
主要是数据库的活动状态信息,它把存储在内存里的信息、和存储在控制文件里的信息,以视图的形式展现出来。

v$parameter:初始化参数文件中所有项的值,
v$process:当前进程的信息,
v$session:有关会话的信息,
v$sysstat:基于当前操作会话进行的系统统计,
v$log:从控制文件中提取有关重做日志组的信息,
v$logfile有关实例重置日志组文件名及其位置的信息,
v$lock:当前进程已获得的和正在请求的锁定信息,
v$transaction:数据库的事务信息。
v$fixed_view_definition中记录了所有的动态性能视图的定义信息。 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值