Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以 有N张表。有了数据库,就可以创建表空间。
表空间(tablespace)是数据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。为了便于管理和提高运行效率,可以使用一些附加表空间来划分用户和应用程序。例如:USER表空间供一般用户使用,RBS表空间供回滚段使用。一个表空间只能属于一个数据库。
Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间,用于存放数据库的对象,一个数据库可以由多个表空间组成。可以通过表空间来实现对Oracle的调优。(Oracle数据库独特的高级应用)
#1.创建表空间
create tablespace tablespace_name
datafile 'D:\oracle.dbf'
size 10M
autoextend on
#2.删除表空间(删除表空间之前最好对数据库进行备份,防止误删!)
drop tablespace tablespace_name;
#3.重命名表空间:
alter tablespace 原表空间名 rename to 新表空间名;
#4.查看系统表空间
--查看表空间
select * from v$tablespace;
### 2.角色和权限
```sql
#1oracle 用户
sys;//系统管理员,拥有最高权限
system;//本地管理员,次高权限
scott;//普通用户,密码默认为tiger,默认未解锁
oracle有三个默认的用户名和密码
1.用户名:sys密码:change_on_install
2.用户名:system密码:manager
3.用户名:scott密码:tiger
#2.创建用户的语法:
create user 用户名
identified by 密码
[default tablespace 默认表空间]
[tempoaray tablespace 临时表空间];
#3.修改用户的密码的语法:
alter user 用户名 identified by 新密码;
#4.删除用户的语法:
drop user 用户名 cascade;``
#1.系统权限 #常见的系统权限如下: 1) create session --连接到数据库 2) create table --创建表 3) create view --创建视图 4) create
sequence --创建序列#2.对象权限
#Oracle中常用的系统预定义角色如下(具体内容请查看书本P47): 1) connect:连接数据库 ALTER SESSION --修改会话
CREATE CLUSTER --建立聚簇
CREATE DATABASE LINK --建立数据库链接
CREATE SEQUENCE --建立序列
CREATE SESSION --建立会话
CREATE SYNONYM --建立同义词
CREATE VIEW --建立视图 2) resource:可以创建表、触发器、过程等。 CREATE CLUSTER --建立聚簇
CREATE PROCEDURE --建立过程
CREATE SEQUENCE --建立序列
CREATE TABLE --建表
CREATE TRIGGER --建立触发器
CREATE TYPE --建立类型 3) dba:数据库管理员,拥有管理员的最高权限。
#授予权限&撤销权限的语法示例如下:
grant connect,resource to t166; --授予connect和resource两个角色
grant select on scott.emp to t166; --授予select权限
revoke connect,resource from t166; --授予connect和resource两个角色
revoke select on scott.emp from t166; --授予select权限
grant create synonym to t166--给用户t166有创建私有同义词的权限
grant create public synonym to t166--给用户t166有创建公有同义词的权限
1) 查看所有用户:
select * from dba_users;
select * from all_users;
select * from user_users;
2) 查看用户或角色系统权限(直接赋值给用户或角色的系统权限):
select * from dba_sys_privs;
select * from user_sys_privs;
3) 查看角色(只能查看登陆用户拥有的角色)所包含的权限
select * from role_sys_privs;
4) 查看用户对象权限:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
5) 查看所有角色:
select * from dba_roles;
6) 查看用户或角色所拥有的角色:
select * from dba_role_privs;
select * from user_role_privs;
```
identified by 密码
[default tablespace 默认表空间]
[tempoaray tablespace 临时表空间];
#3.修改用户的密码的语法:
alter user 用户名 identified by 新密码;
#4.删除用户的语法:
drop user 用户名 cascade;
序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。
其主要用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。
序列是一种数据库对象,用来自动生成一组唯一的序号. 序列是一种共享式的对象,多个用户可以共同使用序列中的序号.
一般将序列应用于表的主键列,这样,当向表中插入数据时,主键列就使用了序列的序号,从而保证主键不会重复.
用序列来产生主键,可以获得可靠的主键值.一句话: 序列就是序号生成器!
#创建序列的语法:
create sequence sequence_name
start with integer
increment by integer
maxvalue integer [nomaxvalue]
minvalue integer [nominvalue]
[cycle|nocycle]
[cache integer|nocache];
#序列的使用:
insert into dept values(sequence_name.nextval,'SELECT');
select * from dept;
select seql.currval from dual;
#更改序列的语法:
alter sequence sequence_name
[increment by integer]
[maxvalue integer |nomaxvalue]
[minvalue integer |nominvalue]
[cycle|nocycle]
[cache|nocache]
#删除序列的语法:
drop sequence sequence_name;
--oracle uuid
select sys_guid() from dual;
============================================================================
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和试图的功能类似,就是一种
映射关系。且同义词不占用实际存储空间,如同视图一样,只在数据字典中保存了同义词的定义。
#1.私有同义词 私有同义词只能被当前模式的用户访问,且私有同义词名称不可与当前模式的对象名称相同。 要在当前模式下创建私有同义词,用户必须拥有create synonym系统权限。要在其他用户模式 创建私有同义词,用户必须拥有create
any synonym系统权限。
1)创建私有同义词的语法:
create synonym sy_emp for scott.emp; --给emp表创建同义词名为sy_emp
#2.公有同义词
公有同义词可被所有数据库用户访问。公有同义词可以隐藏数据库对象的所有者和名称,并降低
SQL语句的复杂性。要创建公有同义词。该用户必须拥有create public synonym系统权限。
1)创建公有同义词的语法
create public synonym sy_emp2 for scott.emp;--给emp表创建共有同义词名为sy_emp2
#3.私有同义词与公有同义词的区别;
私有同义词只能在当前默认下访问,且不能与当前模式的对象同名。
公有同义词可被所有的数据库用户访问。
#4.删除同义词的语法:
drop [public] synonym synonym_name;
1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。
2)索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率
3)索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表;
4)索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响
5)索引对用户是透明的,无论表上是否有索引,sql语句的用法不变
6)oracle创建主键时会自动在该列上创建索引
- B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值) 1)说明:
1.oracle中最常用的索引;B树索引就是一颗二叉树;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID值
2.所有叶子节点具有相同的深度,因而不管查询条件怎样,查询速度基本相同
3.能够适应精确查询、模糊查询和比较查询2)分类:UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)
3)创建例子:craete index index_sno on student(‘sno’);
4)适合使用场景:列基数(列不重复值的个数)大时适合使用B数索引
反向索引: 1) 说明:
1.反向键索引是特殊的B数索引
2.适用于在表中严格排序的列上创建反向键索引
3.查询时只要像常规方式一样查询数据,不需要关心反向键处理,因为oracle会自动完成该处理。 2) 原理: 如果用户使用序列编号在表中添加新的纪录,则反向键索引首先反向转换每个键值的字节,然后在反向后的新数据在进行索引.例如:用户输入的索引键是4201,那么反向键索引将其反向转换为1024,这样索引键就变成非递增了,也就意味着,如果将反向后的索引键添加到叶子节点中,可能在任意的叶子节点中进行,从而使新的数据在值得范围分布式比原来的均匀。
创建反向键索引
1.适用于在表中严格排序的列上创建反向键索引 3) 创建语法:create index index_reverse_empno no employee(empno) reverse; 4)适合场景: 适用于在表中严格排序的列上创建反向键索引
- 位图索引 1)说明: 创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建立一个位图(位图中,对表中每一行使用一位(bit,0或者1)来标识该行是否包含该位图的索引列的取值,如果为1,表示对应的rowid所在的记录包含该位图索引列值),最后通过位图索引中的映射函数完成位到行的ROWID的转换
2)创建例子:create bitmap index index_sno on student(sno);
- 适合场景:对于基数小的列适合简历位图索引(例如性别等)
- 单列索引和复合索引(基于多个列创建) 1) 注意: 即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列
这里是引用
- 函数索引
1)说明:
1. 当经常要访问一些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度
2. 函数索引既可以使用B数索引,也可以使用位图索引;当函数结果不确定时采用B树索引,结果是固定的某几个值时使用位图索引
3. 函数索引中可以用len、trim、substr、upper(每行返回独立结果),不能使用如sum、max、min、avg等
2)例子:
create index fbi on student (upper(name)); select * from student
where upper(name) =‘WISH’;
表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。
分区表:
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。优点: 1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点: 分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。
#1.范围表分区 范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。
当使用范围分区时,请考虑以下几个规则: 1) 每一个分区都必须有一个VALUES LESS
THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。 2) 所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。 3)
在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE
LESS THEN的值,同时包括空值。
创建范围分区表:
create table 表分区名(
列1 数据类型,
列2 数据类型,
列n 数据类型
)
partiton by range(列)
(
partition P1 values less than (to_date('2001-12-10','yyyy-mm-dd')),
partition P2 values less than (to_date('2002-12-10','yyyy-mm-dd')),
partition P3 values less than (to_date('2003-12-10','yyyy-mm-dd')),
partition P4 values less than (to_date('2004-12-10','yyyy-mm-dd')),
partition P5 values less than (maxvalue)
);
--insert into 表分区 value ('');
CREATE TABLE SALES1
(
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL
)
PARTITION BY RANGE (SALES_DATE)
(
PARTITION P1 VALUES LESS THAN (to_date('2013-04-1', 'yyyy-mm-dd')),
PARTITION P2 VALUES LESS THAN (to_date('2013-07-1', 'yyyy-mm-dd')),
PARTITION P3 VALUES LESS THAN (to_date('2013-10-1', 'yyyy-mm-dd')),
PARTITION P4 VALUES LESS THAN (to_date('2014-01-1', 'yyyy-mm-dd')),
PARTITION P5 VALUES LESS THAN (maxvalue)
);
--要查看在第三季度的数据
SELECT * FROM SALES1 partition(P3);
--要删除第三季度的数据
DELETE FROM SALES1 partition(P3);
#查看表分区情况
select table_name,partition_name from user_table_partitions where partiton_name=upper(表分区名称);
#添加表分区
alter table sales1 add partition P6 values less than (to_date('2015-12-10','yyyy-mm-dd'));
#删除分区
以下代码删除了P3表分区:
alter table sales1 drop partition P3;
在以下代码删除了P4SUB1子分区:
ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
运行cmd命令行
录入 sqlplus /nolog 无用户名登录
conn /as sysdba 连接到数据本地数据
alter user system identified by password; 修改System 密码 为 password
alter user system account unlock;解锁system账号
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED 密码过期
create user t154 identified by t154; --设置账号
grant connect,resource,dba to t154; --授权