同义词,视图,索引,表空间,
视图(view)
本质是一个预查询,普通用户再使用视图view之前必须由管理员用户赋予用户创建视图的权限。
grant create view to scott;
-- 创建视图的语法格式
create [or replace][force|noforce] view 视图名称
as
select 查询语句
[with read only];
-- or replace:如果你在创建视图的时候添加了or replace 当时与已经存在的时候,进行替换
-- force:哪怕视图创建所基于的表不村子啊,也可以强制创建视图
-- noforce:默认选项,如果视图所基于的表不存在,则无法创建视图
-- with read only:代表表当前视图时图个只读视图,用户无法通过视图去修改基表的数据
-- 如果没有设置with read only 用户就可以通过视图去修改表数据,时非常危险的,一般来说不希望使用者通过视图去修改基表的数据,再创建视图的时候尽量加上with read only 只读约束
视图的意义何在:
- 简化复杂查询
- 保护基表数据
- 屏蔽使用者而不关心或者是不希望被使用者所访问的字段
同义词
同义词可以理解为是大号的别名,是为数据库对象服务的别名。
-- 赋予用户创建同义词的权限
grant create synonym to 用户名;
-- 使用A用户给B用户中的表1建立一个同义词
-- 如果访问的数据库对象并不是当前用户自己的对象,必须再对象前加上所属用户的用户名
-- A用户操作:
create synonym 同义词名 for B.表1;
-- 同义词创建成功,但是由于A用户没有访问B用户表1的权限,导致同义词无法使用
-- 解决方法:
-- 1.让A用户拥有表1的权限
-- 2.在Oracle中管理员用户访问普通用户的数据,是不需要任何权限的,作为普通用户,想访问其他用户的数据,必须先获得权限
-- B用户操作(赋予A用户权限):
grant all on 表1 to 用户A;
索引(用处最大)
索引原理需要有对应的数据结构基础,包括但不限于:树,二叉树,平衡二叉树,前序遍历,中序遍历,后序遍历,hash散列,B树
索引的目的:提高查询性能
Oracle的索引种类:B树索引,位图索引,Hash索引,聚族索引,非聚族索引
-- 索引是加你在数据库的表的某一字段上的,在建立索引的时候,索引会对所建立字段的所有值进行与排序,将相关字段值和是对应行的rowid 存放到索引对应的数据库结构中,当我们查询的时候,使用了索引的字段作为where的条件或者order by排序字段,数据库就不会进行全表遍历,二十从索引找到指定行数据的rowid根据rowid直接定位数据
-- 当创建表的时候,数据库会自动为所有的主键约束和唯一约束的字段,自动制造索引
-- 开发常用索引
-- 1.普通索引:允许字段中的值出现重复,给emp表的ename字段添加普通索引
create index ename_idx on emp(ename);
-- 2.唯一索引:建立的字段必须是主键或者唯一键,给dept表的dname添加唯一索引
create index dname_idx on dept(dname);
-- 3.联合索引:将多个字段的值的组合作为索引排序的依据
create index test_idx on emp(ename,job);
-- 索引的特点
-- 1.极大的提高了查询的性能,表的数据量越大,索引带来的性能的提升就越大
-- 2.建立索引的字段重复值越少,索引的性能越好,性别这样的字段是不适合建立索引的
-- 3.索引并不是越多越好,一张表最好不要超过五个索引,某个字段是否需要建立索引,应该考虑这个字段是否是被查询,查询经常使用的字段或者是排序经常使用到的字段,如果字段的使用频率很搞,哪怕有重复值,也必须建立索引
-- 4.对表数据的增删改查,会使数据库的索引失效,数据库会自动重建索引,所以在建立索引的时候,需要考虑这张表是否会频繁的增删改查(考虑的是重建索引的性能开销)
-- 5.但是,如果表的数据量特别大,不管这张表是否会被频繁的增删改查,都必须建立索引
-- 6.在进行查询的时候,需要注意where之后条件的使用,不合规范的使用会导致数据库放弃使用索引,而进行全表检索:
-- -- where之后使用(!=)不等号会放弃使用索引
select * from student where age != 18;-- 不会使用索引
select * from student where age < 18 union
select * from student where age > 18;-- 会使用索引
-- -- in条件会导致索引失效,索引尽可能保证in之后的数据量尽可能小
-- -- 模糊查询的时候(%)不可以在第一位,否则索引会失效
select * from student where name like '%三'; -- 不会使用索引
select * from studnet where name like '张%'; -- 会使用索引
-- -- where 后面的条件,字段本身不要使用函数处理,否则会是索引失效,如果可以的话,尽量把函数放在 = 的右边,而不是左边
表空间
数据最终是存储在硬盘中的,最小存储单元是bit位,操作系统不可能一位作为数据管理和操作单元,为了方便操作系统管理数据,操作系统存在最小存储单元的概念。
块(block)
为了能够在不同的系统中方便的使用数据库,Oracle定义了数据库的概念,目的是为了屏蔽不同的操作系统所带来的存储架构的差异性,block也就是Oracle的最小存储单元,Oracle所有对数据的操作和空间分配,都是以block为单位进行的,一个block默认为8KB
区(extend)
block的上一级概念,区是比block还大一级的存储结构,表示的是一连串的block的集合
段(segment)
比区还大一级的是段,段一般是数据库对象,一般来说,一个数据库对象对应一个段,一个段对应多个区,一个区对应多个块。
-- 一些需要查看的系统视图在sys用户下
-- 表空间tablespace
-- 表空间一般是由一个或多个的数据文件(datafile)所组成
-- datafile是物理磁盘中真是存在的文件,用于存储数据库的数据,块,区,段正式表空间的数据存储结构
-- 一个表空间至少有一个数据文件,一个表空间可以拥有多个段,但是一个段只能属于一个表空间
-- 表空间的分类:
-- system表空间 系统表空间
-- sysaux 系统辅助表空间 这个表空间用户无法直接查看
-- users表空间 如果是腹痛用户的数据库对象,在没有指定表空间存储的情况下,会默认存放在users表空间下
-- temp表空间 类似于windows系统中的虚拟内存或者Linux系统中的swap交换分区
-- 用户自定义表空间
-- 赋予用户创建表空间的权限
grant create tablespace to 用户名;
-- 创建自定义表空间
create tablespace myspace
datafile 'c:/myspace_1.ora' size 10M, 'c:/myspace_2.ora' size 50M
extent management local;-- 表空间中区的分配由Oracle系统自己完成
-- 我们可以在创建数据库对象(段)指定其所属的表空间,普通用户如果不指定表空间,数据库对象默认就会存储在users表空间里
create table 表名() tablespace 表空间名;
-- 管理员用户也可以在创建用户的同时指定该用户的表空间
create user st identified by a123 default tablespace 表空间名;
-- 修改表空间的数据文件大小(管理员用户下执行)
alter database datafile '配置文件路径' resize 50M;
-- 给表空间添加数据文件
alter tablespace 表空间名 add datafile '配置文件路径' size 10M;
-- 删除表空间,管理员是拥有直接删除表空间的权限的,如果是普通用户,需要赋予对应的权限
grant drop table space to 用户名;
-- 在删除表空间的时候,可以连带删除表空间内的所有内容
drop tablespace 表空间名 including contents;
-- 查找所有数据的分配情况(系统试图)
select * from dba_extents order by block_id asc;