• 管管管管管管管管管管 • 管管管管管管管 • 管管管 • 管管管管 • 管管管管管管管 Oracle 管管管管管管管管管管
Jan 03, 2016
• 管理表空间和数据文件• 存储结构和关系• 管理表• 管理索引• 维护数据完整性
Oracle 数据库的对象及其管理Oracle 数据库的对象及其管理
主要内容主要内容– 说明数据库的逻辑结构 – 创建表空间– 使用不同方法改变表空间大小 – 改变表空间的状态和存储设置– 重定位表空间 – 准备必要的表空间
– 说明数据库的逻辑结构 – 创建表空间– 使用不同方法改变表空间大小 – 改变表空间的状态和存储设置– 重定位表空间 – 准备必要的表空间
概述概述
数据库
控制文件
重做日志文件数据文件
数据库
逻辑的 物理的
表空间 数据文件
O/S 块Oracle 块
段
范围
数据库结构数据库结构
SYSTEM 表空间和非 SYSTEM 表空间SYSTEM 表空间和非 SYSTEM 表空间
• SYSTEM 表空间包含 :
• 数据字典信息• SYSTEM 回滚段
• SYSTEM 表空间包含 :
• 数据字典信息• SYSTEM 回滚段
• 非 SYSTEM 表空间包含 :
• 回滚段• 临时段• 应用数据• 应用索引
• 非 SYSTEM 表空间包含 :
• 回滚段• 临时段• 应用数据• 应用索引
创建表空间创建表空间
CREATE TABLESPACE app_data
DATAFILE ‘DISK4/app01.dbf’ SIZE 100M,
‘DISK5/app02.dbf’ SIZE 100M
MINIMUM EXTENT 500K
DEFAULT STORAGE (INITIAL 500K NEXT 500K M
AXEXTENTS 500 PCTINCREASE 0);
CREATE TABLESPACE app_data
DATAFILE ‘DISK4/app01.dbf’ SIZE 100M,
‘DISK5/app02.dbf’ SIZE 100M
MINIMUM EXTENT 500K
DEFAULT STORAGE (INITIAL 500K NEXT 500K M
AXEXTENTS 500 PCTINCREASE 0);
例子例子
存储参数 存储参数
以下参数影响段的存储分配 :
• INITIAL
• NEXT
• MAXEXTENTS
• MINEXTENTS
• PCTINCREASE
以下参数影响段的存储分配 :
• INITIAL
• NEXT
• MAXEXTENTS
• MINEXTENTS
• PCTINCREASE
临时表空间临时表空间
• 排序操作使用• 不能包含永久对象• 排序操作使用• 不能包含永久对象
CREATE TABLESPACE sort
DATAFILE ‘DISK2/sort01.dbf’ SIZE 50M
MINIMUM EXTENT 1M
DEFAULT STORAGE (INITIAL 2M NEXT 2M MAXEX
TENTS 500 PCTINCREASE 0)
TEMPORARY;
CREATE TABLESPACE sort
DATAFILE ‘DISK2/sort01.dbf’ SIZE 50M
MINIMUM EXTENT 1M
DEFAULT STORAGE (INITIAL 2M NEXT 2M MAXEX
TENTS 500 PCTINCREASE 0)
TEMPORARY;
为表空间增加数据文件为表空间增加数据文件
ALTER TABLESPACE app_data
ADD DATAFILE
‘DISK5/app03.dbf’ SIZE 200M;
ALTER TABLESPACE app_data
ADD DATAFILE
‘DISK5/app03.dbf’ SIZE 200M;
表空间表空间 APP_DATAAPP_DATA
app03.dbf 2M
app02.dbf1M
app01.dbf1M
例子例子
数据文件的自动扩展数据文件的自动扩展
ALTER TABLESPACE app_data
ADD DATAFILE
‘DISK6/app04.dbf’ SIZE 200M
AUTOEXTEND ON NEXT 10M
MAXSIZE 500M;
ALTER TABLESPACE app_data
ADD DATAFILE
‘DISK6/app04.dbf’ SIZE 200M
AUTOEXTEND ON NEXT 10M
MAXSIZE 500M;
表空间表空间 APP_ DATAAPP_ DATA
app04.dbf 2M
app03.dbf2M
app01.dbf1M
app02.dbf1M
例子例子
1M
•ALTER DATABASE DATAFILE ‘DISK5/app02.dbf’ RESIZE 200M;•ALTER DATABASE DATAFILE ‘DISK5/app02.dbf’ RESIZE 200M;
表空间表空间 APP_DATAAPP_DATA
app02.dbf1M
手工改变数据文件的大小手工改变数据文件的大小
app01.dbf1M
例子例子
改变存储设置改变存储设置例子例子ALTER TABLESPACE app_data
MINIMUM EXTENT 2M;
ALTER TABLESPACE app_data
DEFAULT STORAGE
(INITIAL 2M NEXT 2M
MAXEXTENTS 999);
ALTER TABLESPACE app_data
MINIMUM EXTENT 2M;
ALTER TABLESPACE app_data
DEFAULT STORAGE
(INITIAL 2M NEXT 2M
MAXEXTENTS 999);
脱机状态 脱机状态 • 脱机的表空间不能进行数据的存取操
作• SYSTEM 表空间和带有活动回滚段的
表空间 均不能脱机
• 脱机的表空间不能进行数据的存取操作• SYSTEM 表空间和带有活动回滚段的
表空间 均不能脱机
ALTER TABLESPACE app_data OFFLINE;ALTER TABLESPACE app_data OFFLINE;
例子例子
移动数据文件 :ALTER TABLESPACE
移动数据文件 :ALTER TABLESPACE
– 表空间 APP_DATA 必须脱机– 目标数据文件必须存在– 表空间 APP_DATA 必须脱机– 目标数据文件必须存在
ALTER TABLESPACE app_data RENAME D
ATAFILE ‘DISK4/app01.dbf’ TO ‘DISK
5/app01.dbf’;
ALTER TABLESPACE app_data RENAME D
ATAFILE ‘DISK4/app01.dbf’ TO ‘DISK
5/app01.dbf’;
例子例子
移动数据文件 : ALTER DATABASE
移动数据文件 : ALTER DATABASE
– 数据库必须已经装配 – 目标数据文件必须存在– 数据库必须已经装配 – 目标数据文件必须存在
ALTER DATABASE RENAME FILE ‘DISK1/
system01.dbf’ TO ‘DISK2/system01.d
bf’;
ALTER DATABASE RENAME FILE ‘DISK1/
system01.dbf’ TO ‘DISK2/system01.d
bf’;
例子例子
表空间的只读状态表空间的只读状态
ALTER TABLESPACE app_data READ
ONLY;
ALTER TABLESPACE app_data READ
ONLY;
表空间表空间 APP_DATAAPP_DATA 只允许进行读操作只允许进行读操作
例子例子
设置表空间为只读 设置表空间为只读
• 表空间必须联机• 没有活动的事务才可以• 表空间不能包含活动的回滚段• 表空间当前一定不能与联机备份有关
• 表空间必须联机• 没有活动的事务才可以• 表空间不能包含活动的回滚段• 表空间当前一定不能与联机备份有关
删除表空间删除表空间
DROP TABLESPACE app_data
INCLUDING CONTENTS;
DROP TABLESPACE app_data
INCLUDING CONTENTS;
以下语句删除以下语句删除 APP_DATAAPP_DATA 表空间及其全表空间及其全部内容。部内容。
例子例子
获得表空间有关信息获得表空间有关信息•DBA_TABLESPACES
• TABLESPACE_NAME
• NEXT_EXTENT
• MAX_EXTENTS
• PCT_INCREASE
• MIN_EXTLEN
• STATUS
• CONTENTS
•DBA_TABLESPACES • TABLESPACE_NAME
• NEXT_EXTENT
• MAX_EXTENTS
• PCT_INCREASE
• MIN_EXTLEN
• STATUS
• CONTENTS
获得数据文件有关信息获得数据文件有关信息
DBA_DATA_FILESDBA_DATA_FILES• FILE_NAME
• TABLESPACE_NAME
• BYTES
• AUTOEXTENSIBLE
• MAXBYTES
• INCREMENT_BY
DBA_DATA_FILESDBA_DATA_FILES• FILE_NAME
• TABLESPACE_NAME
• BYTES
• AUTOEXTENSIBLE
• MAXBYTES
• INCREMENT_BY
• 管理表空间和数据文件• 存储结构和关系• 管理表• 管理索引• 维护数据完整性
Oracle 数据库的对象及其管理Oracle 数据库的对象及其管理
主要内容主要内容
– 列出不同种类的段及其它们的使用由段控制范围的使用
– 说明对象的块空间利用参数的使用– 从数据字典获得存储结构的有关信息– 根据分裂程度和生存范围确定段的位置
– 列出不同种类的段及其它们的使用由段控制范围的使用
– 说明对象的块空间利用参数的使用– 从数据字典获得存储结构的有关信息– 根据分裂程度和生存范围确定段的位置
数据库
逻辑的 物理的
表空间 数据文件
O/S 块Oracle 块
段
范围
数据库存储层次
段的种类段的种类
表表
簇簇
表分区表分区
索引索引
段的种类段的种类
索引组织表索引组织表索引分区索引分区
回滚段回滚段 临时段临时段
段的种类段的种类
LOBLOB 索引索引 LOBLOB 段段
引导程序引导程序段段
嵌套的表嵌套的表
存储子句的优先级存储子句的优先级
Oracle 缺省表空间
段
范围的分配和去配范围的分配和去配– 段在以下情况分配
+ 创建 + 扩展+ 修改
– 段在以下情况去配• 删除• 修改• 清除• 自动调整大小 ( 仅回滚段 )
– 段在以下情况分配+ 创建 + 扩展+ 修改
– 段在以下情况去配• 删除• 修改• 清除• 自动调整大小 ( 仅回滚段 )
使用的和空闲的范围使用的和空闲的范围
数据文件数据文件
空闲的范围空闲的范围使用的范围使用的范围文件头文件头
空闲空间合并空闲空间合并
空闲的范围空闲的范围使用的范围使用的范围文件头文件头
之前之前
ALTER TABLESPACE data01 COALESCE;ALTER TABLESPACE data01 COALESCE;
之后之后
数据库块 : 回顾数据库块 : 回顾
• I/O 的最小单位• 由一个或多个 O/S 块组成• 由参数 DB_BLOCK_SIZE 设置• 在数据库创建时设置
• I/O 的最小单位• 由一个或多个 O/S 块组成• 由参数 DB_BLOCK_SIZE 设置• 在数据库创建时设置
数据库块内容数据库块内容
头头
空闲空间空闲空间
数据数据
块空间利用参数块空间利用参数
INITRANSINITRANS
MAXTRANSMAXTRANS
PCTFREEPCTFREE
PCTUSEDPCTUSED
块空间的使用块空间的使用
插入插入
插入插入
插入插入
插入插入
1 2
3 4
PCTFREE=20PCTFREE=20 PCTUSED=40PCTUSED=40
80%80%
80%80%
40%40%
数据字典视图数据字典视图
表空间DBA_TABLESPACES
段DBA_SEGMENTS
数据文件DBA_DATA_FILES
空闲的范围DBA_FREE_SPACE
使用的范围DBA_EXTENTS
查询段的有关信息查询段的有关信息DBA_SEGMENTS
– 一般信息– OWNER
SEGMENT_NAME
– SEGMENT_TYPE
– TABLESPACE_NAME
DBA_SEGMENTS
– 一般信息– OWNER
SEGMENT_NAME
– SEGMENT_TYPE
– TABLESPACE_NAME
– 大小– EXTENTS
– BLOCKS
– 存储设置– INITIAL_EXTENT
– NEXT_EXTENT
– MIN_EXTENTS
– MAX_EXTENTS
– PCT_INCREASE
获得使用的范围信息获得使用的范围信息DBA_EXTENTS
– 标识– OWNER
– SEGMENT_NAME
– EXTENT_ID
– 位置和大小– TABLESPACE_NAME
– RELATIVE_FNO
– FILE_ID
– BLOCK_ID
– BLOCKS
DBA_EXTENTS
– 标识– OWNER
– SEGMENT_NAME
– EXTENT_ID
– 位置和大小– TABLESPACE_NAME
– RELATIVE_FNO
– FILE_ID
– BLOCK_ID
– BLOCKS
检查空闲的范围信息检查空闲的范围信息
DBA_FREE_SPACE
– 位置和大小– TABLESPACE_NAME
– RELATIVE_FNO
– FILE_ID
– BLOCK_ID
– BLOCKS
DBA_FREE_SPACE
– 位置和大小– TABLESPACE_NAME
– RELATIVE_FNO
– FILE_ID
– BLOCK_ID
– BLOCKS
• 管理表空间和数据文件• 存储结构和关系• 管理表• 管理索引• 维护数据完整性
Oracle 数据库的对象及其管理Oracle 数据库的对象及其管理
主要内容主要内容
– 区分不同种类的 Oracle 数据类型– 使用适当的存储设置创建表– 控制表所使用的空间– 分析表检查其完整性及其迁移情况– 从数据字典检索有关表的信息– 不同格式 ROWID 之间的相互转换
– 区分不同种类的 Oracle 数据类型– 使用适当的存储设置创建表– 控制表所使用的空间– 分析表检查其完整性及其迁移情况– 从数据字典检索有关表的信息– 不同格式 ROWID 之间的相互转换
存储用户数据存储用户数据
规则的表规则的表
簇簇
分区的表分区的表
索引组织的表索引组织的表
行结构 行结构
数据库块数据库块行头行头列长度列长度列值列值
Oracle 数据类型Oracle 数据类型
CHAR(N), NCHAR(N)CHAR(N), NCHAR(N)VARCHAR2(N),VARCHAR2(N),NVARCHAR2(N)NVARCHAR2(N)NUMBER(P,S)NUMBER(P,S)DATEDATERAW(N)RAW(N)BLOB, CLOB,BLOB, CLOB,NCLOB, BFILENCLOB, BFILELONG, LONG RAWLONG, LONG RAWROWIDROWID
VARRAYVARRAY
TABLETABLE
REFREF
数据类型数据类型
内置的内置的用户定义的用户定义的
标量标量 关系关系集合集合
ROWID 数据类型ROWID 数据类型
OOOOOO BBBBBBFFF RRR
数据对象号 相对文件号 行号块号
ROWID ROWID 格式格式
– 行的唯一标识符 – 用作行定位– 行的唯一标识符 – 用作行定位
受限的 ROWID受限的 ROWID
– 可以在一个段内确定行– 需要较少空间– 可以在一个段内确定行– 需要较少空间
BBBBBBBB FFFFRRRR
块号 行号 文件号
. .
集合集合– 集合是包含对象的对象– VARRAY 是有次序的元素集合,其中包
括计数和界限– 嵌套的表是带有 TABLE 数据类型列的表
– 集合是包含对象的对象– VARRAY 是有次序的元素集合,其中包
括计数和界限– 嵌套的表是带有 TABLE 数据类型列的表
VARRAYVARRAY 嵌套表嵌套表
创建表创建表CREATE TABLE employees(
empno NUMBER(4),
last_name VARCHAR2(30)
deptno NUMBER(2))
PCTFREE 20 PCTUSED 50
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE data01;
CREATE TABLE employees(
empno NUMBER(4),
last_name VARCHAR2(30)
deptno NUMBER(2))
PCTFREE 20 PCTUSED 50
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE data01;
创建表 : 指导原则创建表 : 指导原则
• 使用较小的标准范围大小以减少 表空间的碎片
• 对于频繁使用并且较小的表可以使用 CACHE 子句
• 使用较小的标准范围大小以减少 表空间的碎片
• 对于频繁使用并且较小的表可以使用 CACHE 子句
PCTFREE 和 PCTUSED 的设置PCTFREE 和 PCTUSED 的设置• 计算 PCTFREE• 计算 PCTFREE
( 平均行大小 初始行大小 ) * 100
平均行大小
• 计算 PCTUSED• 计算 PCTUSED 平均行大小 * 100
100 PCTFREE 可用数据空间
行迁移和链接行迁移和链接更新之前更新之前 更新之后更新之后
拷贝一个存在的表拷贝一个存在的表
CREATE TABLE new_emp
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
NOLOGGING
TABLESPACE data01
AS
SELECT * FROM scott.employees;
CREATE TABLE new_emp
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
NOLOGGING
TABLESPACE data01
AS
SELECT * FROM scott.employees;
改变存储参数和块利用参数改变存储参数和块利用参数
ALTER TABLE scott.employees
PCTFREE 30
PCTUSED 50
STORAGE(NEXT 500K
MINEXTENTS 2
MAXEXTENTS 100);
ALTER TABLE scott.employees
PCTFREE 30
PCTUSED 50
STORAGE(NEXT 500K
MINEXTENTS 2
MAXEXTENTS 100);
手工分配范围手工分配范围
ALTER TABLE scott.employees
ALLOCATE EXTENT(SIZE 500K
DATAFILE ‘DISK3/DATA01.DBF’);
ALTER TABLE scott.employees
ALLOCATE EXTENT(SIZE 500K
DATAFILE ‘DISK3/DATA01.DBF’);
Free space after deleteFree space after deleteUnused blockUnused block
高水位高水位
范围 范围 IDID 0 0 11 22 33 44
范围 范围 IDID 0 0 11 22 33 44
Used blockUsed block
高水位高水位插入之后插入之后
删除之后删除之后
得到高水位 : DBMS_SPACE.UNUS
ED_SPACE 得到高水位 : DBMS_SPACE.UNUS
ED_SPACE
范围 范围 IDID 0 0 11 22 33 44
高水位LAST_USED_EXTENT_FILE_ID, LAST_USED_EXTENT_BLOCK_ID
TOTAL_BLOCKS
UNUSED_BLOCKS
删除之后的空闲空间删除之后的空闲空间未使用的块未使用的块
高水位高水位
去配之前去配之前
使用的块使用的块
未使用空间的去配未使用空间的去配
ALTER TABLE scott.employees
DEALLOCATE UNUSED;
ALTER TABLE scott.employees
DEALLOCATE UNUSED;
去配之后去配之后
清除表清除表
TRUNCATE TABLE scott.employees;TRUNCATE TABLE scott.employees;
范围 范围 IDID 0 0 11
高水位高水位
空闲空间空闲空间
删除表删除表
DROP TABLE scott.departments
CASCADE CONSTRAINTS;
DROP TABLE scott.departments
CASCADE CONSTRAINTS;
分析表结构分析表结构– Oracle 服务器核实每一个数据块的完
整性– 使用 CASCADE 选项可以确认与表有
关的全部索引,并且执行表和索引之间的交叉引用
– Oracle 服务器核实每一个数据块的完整性
– 使用 CASCADE 选项可以确认与表有关的全部索引,并且执行表和索引之间的交叉引用
ANALYZE TABLE scott.employees
VALIDATE STRUCTURE;
ANALYZE TABLE scott.employees
VALIDATE STRUCTURE;
检测行迁移检测行迁移– Oracle 服务器根据样本数据收集统计信息
并更新数据字典
– 检查 CHAIN_CNT
– Oracle 服务器根据样本数据收集统计信息并更新数据字典
– 检查 CHAIN_CNT
ANALYZE TABLE scott.employees
ESTIMATE STATISTICS;
ANALYZE TABLE scott.employees
ESTIMATE STATISTICS;
SELECT chain_cntFROM DBA_TABLESWHERE table_name=‘EMPLOYEES’ AND owner=‘SCOTT’;
SELECT chain_cntFROM DBA_TABLESWHERE table_name=‘EMPLOYEES’ AND owner=‘SCOTT’;
检索表信息检索表信息DBA_OBJECTS
OWNEROBJECT_NAMEOBJECT_IDDATA_OBJECT_IDCREATED
DBA_SEGMENTS
OWNERSEGMENT_NAMETABLESPACE_NAMEHEADER_FILEHEADER_BLOCK
DBA_TABLES
OWNERTABLE_NAMEPCT_FREEPCT_USEDINITIAL_EXTENTNEXT_EXTENTMIN_EXTENTSMAX_EXTENTSPCT_INCREASECACHEBLOCKSEMPTY_BLOCKSCHAIN_CNT
DBA_EXTENTS
• OWNER
• SEGMENT_NAME
• EXTENT_ID
• FILE_ID
• BLOCK_ID
• BLOCKS
DBA_EXTENTS
• OWNER
• SEGMENT_NAME
• EXTENT_ID
• FILE_ID
• BLOCK_ID
• BLOCKS
检索范围信息检索范围信息
DBMS_ROWID 包DBMS_ROWID 包
函数名称
ROWID_CREATE
ROWID_OBJECT
ROWID_RELATIVE_FNO
ROWID_BLOCK_NUMBER
ROWID_ROW_NUMBER
ROWID_TO_ABSOLUTE_FNO
ROWID_TO_EXTENDED
ROWID_TO_RESTRICTED
说明
根据各个独立部分 建立一个 ROWID
为一个 ROWID 返回对象标识符
为一个 ROWID 返回相对文件号
为一个 ROWID 返回块号
为一个 ROWID 返回行号
为一个 ROWID 返回绝对文件号
将一个 ROWID 从受限的转换成扩展的
将一个 ROWID 从扩展的转换成受限的
通常使用的函数 :通常使用的函数 :
• 管理表空间和数据文件• 存储结构和关系• 管理表• 管理索引• 维护数据完整性
Oracle 数据库的对象及其管理Oracle 数据库的对象及其管理
主要内容主要内容
– 列出各种不同类型的索引及其用途– 建立 B-树和位图索引– 索引重组– 删除索引– 从数据字典获得有关索引信息
– 列出各种不同类型的索引及其用途– 建立 B-树和位图索引– 索引重组– 删除索引– 从数据字典获得有关索引信息
索引分类索引分类逻辑的– 单列的或组合列的– 唯一的或非唯一的物理的– 分区的或非分区的 – B-树或位图
• 正常或倒序键 ( 仅 B-树 )
逻辑的– 单列的或组合列的– 唯一的或非唯一的物理的– 分区的或非分区的 – B-树或位图
• 正常或倒序键 ( 仅 B-树 )
B-树索引B-树索引
索引条目头键列长度键列值ROWID
根
分支
叶
索引条目
KEY ROWID
EMPNO (BLOCK# ROW# FILE#)----- -------------------1257 0000000F.0002.00012877 0000000F.0006.00014567 0000000F.0004.00016657 0000000F.0003.00018967 0000000F.0005.00019637 0000000F.0001.00019947 0000000F.0000.0001... ...... ...
颠倒键索引颠倒键索引EMPEMP 的索引 的索引 (EMPNO)(EMPNO) EMPEMP
表表
EMPNO ENAME JOB ...----- ----- --------7499 ALLEN SALESMAN7369 SMITH CLERK7521 WARD SALESMAN ...7566 JONES MANAGER7654 MARTIN SALESMAN7698 BLAKE MANAGER7782 CLARK MANAGER... ... ... ...... ... ... ...
位图索引位图索引
<Blue, 10.0.3, 12.8.3, 1000100100010010100>
<Green, 10.0.3, 12.8.3, 0001010000100100000>
<Red, 10.0.3, 12.8.3, 0100000011000001001>
<Yellow, 10.0.3, 12.8.3, 0010001000001000010>
键键开始开始ROWIDROWID
结束结束ROWIDROWID 位图位图
表
索引
块 10
块 11
块 12
文件 3
B-树与位图索引的比较B-树与位图索引的比较
B- 树
适合于高基数的列
键值的更新相对昂贵
对使用或谓词的查询语句无效
适用于 OLTP
位图
适合于低基数的列
键值的更新非常昂贵
对使用或谓词的查询语句有效
适用于 DSS
建立正常 B-树索引建立正常 B-树索引
CREATE INDEX scott.emp_lname_idx
ON scott.employees(last_name)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
CREATE INDEX scott.emp_lname_idx
ON scott.employees(last_name)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
创建索引 : 指导原则创建索引 : 指导原则
– 权衡查询和 DML 的需要– 放置在单独的表空间中– 使用相同的范围大小 : 5 个块的倍数或表
空间 MINIMUM EXTENT 的大小– 大的索引可以考虑使用 NOLOGGING 选
项– 如果新键值都接近当前范围则 PCTFREE
设置要高
– 权衡查询和 DML 的需要– 放置在单独的表空间中– 使用相同的范围大小 : 5 个块的倍数或表
空间 MINIMUM EXTENT 的大小– 大的索引可以考虑使用 NOLOGGING 选
项– 如果新键值都接近当前范围则 PCTFREE
设置要高
建立倒序键索引建立倒序键索引
CREATE UNIQUE INDEX scott.ord_ord_no_idx
ON scott.ord(ord_no) REVERSE
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
CREATE UNIQUE INDEX scott.ord_ord_no_idx
ON scott.ord(ord_no) REVERSE
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
建立位图索引建立位图索引
CREATE BITMAP INDEX scott.ord_region_id_idx
ON scott.ord(region_id)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
CREATE BITMAP INDEX scott.ord_region_id_idx
ON scott.ord(region_id)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
改变索引的存储参数改变索引的存储参数
ALTER INDEX scott.emp_lname_idx
STORAGE(NEXT 400K
MAXEXTENTS 100);
ALTER INDEX scott.emp_lname_idx
STORAGE(NEXT 400K
MAXEXTENTS 100);
索引空间的分配与去配索引空间的分配与去配
ALTER INDEX scott.ord_region_id_idx
ALLOCATE EXTENT (SIZE 200K
DATAFILE ‘DISK6/indx01.dbf’);
ALTER INDEX scott.ord_region_id_idx
ALLOCATE EXTENT (SIZE 200K
DATAFILE ‘DISK6/indx01.dbf’);
ALTER INDEX scott.ord_ord_no_idx
DEALLOCATE UNUSED;
ALTER INDEX scott.ord_ord_no_idx
DEALLOCATE UNUSED;
重建索引 重建索引
ALTER INDEX scott.ord_region_id_idx
REBUILD
TABLESPACE indx02;
ALTER INDEX scott.ord_region_id_idx
REBUILD
TABLESPACE indx02;
使用该命令可以 :– 将一个索引移到另一个不同的表空间– 通过去除已经删除的条目改善空间的利用– 颠倒键索引与正常 B-树索引之间的变换
使用该命令可以 :– 将一个索引移到另一个不同的表空间– 通过去除已经删除的条目改善空间的利用– 颠倒键索引与正常 B-树索引之间的变换
检查索引的有效性检查索引的有效性
ANALYZE INDEX scott.ord_region_id_idx V
ALIDATE STRUCTURE;
ANALYZE INDEX scott.ord_region_id_idx V
ALIDATE STRUCTURE;
INDEX_STATS
删除索引删除索引
• 在大批数据装入之前先删除索引,然后再重建• 删除不经常使用的索引,并在需要时再建立• 删除并重建无效的索引
• 在大批数据装入之前先删除索引,然后再重建• 删除不经常使用的索引,并在需要时再建立• 删除并重建无效的索引
DROP INDEX scott.dept_dname_idx;DROP INDEX scott.dept_dname_idx;
获得有关索引信息获得有关索引信息DBA_INDEXESOWNER
INDEX_NAME
INDEX_TYPE
TABLE_OWNER
TABLE_NAME
UNIQUENESS
TABLESPACE_NAME
LOGGING
STATUS
DBA_INDEXESOWNER
INDEX_NAME
INDEX_TYPE
TABLE_OWNER
TABLE_NAME
UNIQUENESS
TABLESPACE_NAME
LOGGING
STATUS
DBA_IND_COLUMNSINDEX_OWNER
INDEX_NAME
TABLE_OWNER
TABLE_NAME
COLUMN_NAME
COLUMN_POSITION
COLUMN_LENGTH
DBA_IND_COLUMNSINDEX_OWNER
INDEX_NAME
TABLE_OWNER
TABLE_NAME
COLUMN_NAME
COLUMN_POSITION
COLUMN_LENGTH
• 管理表空间和数据文件• 存储结构和关系• 管理表• 管理索引• 维护数据完整性
Oracle 数据库的对象及其管理Oracle 数据库的对象及其管理
主要内容主要内容
– 实现数据完整性约束和触发器– 维护完整性约束和触发器– 从数据字典获得约束和触发器的有关信息
– 实现数据完整性约束和触发器– 维护完整性约束和触发器– 从数据字典获得约束和触发器的有关信息
数据完整性数据完整性
应用程序应用程序
完整性约束完整性约束数据库触发器数据库触发器
表
数据数据
约束的类型约束的类型说明指定一个列不能包含空值标明一个列或列的组合是唯一的标明一个列或列的组合是表的主键标明一个列或列的组合是引用完整性中的外部键指定表的每一行必须满足的条件
约束NOT NULLUNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
延期的约束延期的约束
• DML语句• DML语句检查非延期的约束检查非延期的约束
COMMITCOMMIT
检查延期的约束检查延期的约束
主 / 唯一键强制主 / 唯一键强制
不使用索引不使用索引 建立唯一索引建立唯一索引
使用存在使用存在的索引的索引
是否有可是否有可用的索引用的索引 ??
是是
否否 否否
是是
约束可延期否约束可延期否 ??
建立非唯一索引建立非唯一索引
是是
否否
启用键否启用键否 ??
外部键考虑外部键考虑至Drop parent table
Truncate parent table
Drop tablespace containing parent table
Avoid locks on child table while performing DML on parent table
Perform DML on child table
执行Cascade constraints
Disable/drop foreign key
Use CASCADE CONSTRAINTS clause
Create index on foreign key
Ensure tablespace containing parent key index online
数据库触发器数据库触发器
表
触发器
DML操作
触发器类型• INSERT 或 UPDATE 或 DELETE
• BEFORE 或 AFTER
• ROW 或 STATEMENT
触发器类型• INSERT 或 UPDATE 或 DELETE
• BEFORE 或 AFTER
• ROW 或 STATEMENT
创建表时定义约束 创建表时定义约束
CREATE TABLE scott.employees(
empno NUMBER(4)
CONSTRAINT emp_pk PRIMARY KEY
DEFERRABLE
USING INDEX
STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx01,
last_name VARCHAR2(30)
CONSTRAINT emp_ln_nn NOT NULL,
deptno NUMBER(2))
TABLESPACE data01;
CREATE TABLE scott.employees(
empno NUMBER(4)
CONSTRAINT emp_pk PRIMARY KEY
DEFERRABLE
USING INDEX
STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx01,
last_name VARCHAR2(30)
CONSTRAINT emp_ln_nn NOT NULL,
deptno NUMBER(2))
TABLESPACE data01;
定义约束的指导方针定义约束的指导方针
– 主键和唯一性约束 :• 将索引放置在另外的表空间中• 如果批量装入非常频繁 , 使用非唯一索引
– 自引用外部键 :• 初始装入后再定义或启用外部键• 延期约束检查
– 主键和唯一性约束 :• 将索引放置在另外的表空间中• 如果批量装入非常频繁 , 使用非唯一索引
– 自引用外部键 :• 初始装入后再定义或启用外部键• 延期约束检查
禁用约束禁用约束– 在批量装入时禁用,尤其是自引用外部键
的情况– 禁用主键之前,首先禁用引用外部键
– 唯一索引被删除,但保留非唯一索引
– 在批量装入时禁用,尤其是自引用外部键的情况
– 禁用主键之前,首先禁用引用外部键
– 唯一索引被删除,但保留非唯一索引
ALTER TABLE scott.departments
DISABLE CONSTRAINT dept_pk CASCADE;
ALTER TABLE scott.departments
DISABLE CONSTRAINT dept_pk CASCADE;
启用约束启用约束
启用 启用 NOVALIDATENOVALIDATE
• 不锁表• 主 / 唯一键必须使用非唯 一索引
• 不锁表• 主 / 唯一键必须使用非唯 一索引
ALTER TABLE scott.departments
ENABLE NOVALIDATE CONSTRAINT dept_pk;
ALTER TABLE scott.departments
ENABLE NOVALIDATE CONSTRAINT dept_pk;
启用约束启用约束
启用 启用 VALIDATEVALIDATE
• 锁表• 可以使用唯一或非唯一
索引• 需要正确的表数据
• 锁表• 可以使用唯一或非唯一
索引• 需要正确的表数据
ALTER TABLE scott.employees
ENABLE VALIDATE CONSTRAINT emp_dept_fk;
ALTER TABLE scott.employees
ENABLE VALIDATE CONSTRAINT emp_dept_fk;
使用 EXCEPTIONS 表使用 EXCEPTIONS 表
1. 建立 EXCEPTIONS 表 (utlexcpt.sql)
2. 执行带 EXCEPTIONS 子句的 ALTER TABLE
3. 在 EXCEPTIONS上使用子查询定位不正确数据的行
4. 纠正错误5. 再次执行 ALTER TABLE启用约束
1. 建立 EXCEPTIONS 表 (utlexcpt.sql)
2. 执行带 EXCEPTIONS 子句的 ALTER TABLE
3. 在 EXCEPTIONS上使用子查询定位不正确数据的行
4. 纠正错误5. 再次执行 ALTER TABLE启用约束
禁用和启用触发器禁用和启用触发器
– 使用 ALTER TRIGGER禁用或启用一个触发器
– 使用 ALTER TABLE禁用或启用全部触发器
– 使用 ALTER TRIGGER禁用或启用一个触发器
– 使用 ALTER TABLE禁用或启用全部触发器
ALTER TRIGGER scott.emp_conv_ln
DISABLE;
ALTER TRIGGER scott.emp_conv_ln
DISABLE;
ALTER TABLE scott.employees
ENABLE ALL TRIGGERS;
ALTER TABLE scott.employees
ENABLE ALL TRIGGERS;
删除约束删除约束
– 使用此命令删除约束 :
– 使用此命令删除表及其任何引用的外部键 :
– 使用此命令删除约束 :
– 使用此命令删除表及其任何引用的外部键 :
ALTER TABLE scott.employees
DROP CONSTRAINT emp_ln_uk;
ALTER TABLE scott.employees
DROP CONSTRAINT emp_ln_uk;
DROP TABLE departments
CASCADE CONSTRAINTS;
DROP TABLE departments
CASCADE CONSTRAINTS;
删除触发器删除触发器
DROP TRIGGER scott.audit_dept;DROP TRIGGER scott.audit_dept;
获得约束的有关信息获得约束的有关信息DBA_CONSTRAINTSOWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION R_OWNER R_CONSTRAINT_NAMEDELETE_RULE STATUS DEFERRABLE DEFERRED VALIDATED GENERATED BAD LAST_CHANGE
DBA_CONS_COLUMNSOWNER CONSTRAINT_NAMETABLE_NAME COLUMN_NAME POSITION
获得触发器的有关信息获得触发器的有关信息DBA_TRIGGERS OWNER TRIGGER_NAME TRIGGER_TYPE TRIGGERING_EVENT TABLE_OWNER TABLE_NAME STATUS DESCRIPTION TRIGGER_BODY
DBA_TRIGGER_COLSTRIGGER_OWNERTRIGGER_NAME TABLE_OWNER TABLE_NAME COLUMN_NAME
DBA_OBJECTSOWNEROBJECT_NAME OBJECT_TYPE STATUS