68
第第 Oracle 第第第第 第第第第第第 第第第第第第 Oracle 第第第第第第第第第第第第第第第第第第第第 第第第 第第第第第第第第 、、。

第十一讲 Oracle 对象管理

Embed Size (px)

DESCRIPTION

第十一讲 Oracle 对象管理. 本章学习目标 表、索引和约束是 Oracle 数据库管理的重要对象。本章将介绍它们的概念、分类、创建及管理方法。. 11.1 表 11.2 索引 11.3 完整性约束. 11.1 表. 11.1.1 普通表 11.1.2 索引组织表( IOT ) 11.1.3 分区 11.1.4 簇集 11.1.5 表的存储管理 11.1.6 表信息查询. 索引组织表. 簇. 不同类型的表. 分区表. 普通表. 11.1.1 普通表. 存储 - PowerPoint PPT Presentation

Citation preview

Page 1: 第十一讲  Oracle 对象管理

第十一讲 Oracle 对象管理本章学习目标

表、索引和约束是 Oracle 数据库管理的重要对象。本章将介绍它们的概念、分类、创建及管理方法。

Page 2: 第十一讲  Oracle 对象管理

11.1 表 11.2 索引 11.3 完整性约束

Page 3: 第十一讲  Oracle 对象管理

11.1 表 11.1.1 普通表 11.1.2 索引组织表( IOT ) 11.1.3 分区 11.1.4 簇集 11.1.5 表的存储管理 11.1.6 表信息查询

Page 4: 第十一讲  Oracle 对象管理

不同类型的表

普通表普通表

簇簇

分区表分区表

索引组织表索引组织表

Page 5: 第十一讲  Oracle 对象管理

11.1.1 普通表 存储 创建表时, Oracle 会自动从指定的表空间中为新建的表创建一个数据段,而该表的所有数据都会存放到相应的表段中。 ROWID ROWID 用于惟一标识表行。它间接地给出了表行的物理存放位置,是定位表行最快速的方式。

Page 6: 第十一讲  Oracle 对象管理

ROWID 格式OOOOOO BBBBBBFFF RRR

数据对象号 相对文件号 行号块号

数据对象编号需要 32 位,相关文件编号需要 10 位,块编号需要 22 ,位行编号需要16 位,加起来总共是 80 位或 10 个字节

Page 7: 第十一讲  Oracle 对象管理

数据文件的最大尺寸? 32bit---object number-------- , 每个数据库最多有 4G 个对象 10bit---file number----- , 每个数据库最多有 1024 个文件 22bit---block number-------- , 每个文件最多有 4M 个 BLOCK 16bit---row number-------- , 每个 BLOCK 最多有 64K 个 ROWS

Page 8: 第十一讲  Oracle 对象管理

建表并指定存储参数CREATE TABLE [schema.]table(column datatype[,column datatype]…) [TABLESPACE tablespace] [PCTFREE integer] [PCTUSED integer] [INITRANS integer] [MAXTRANS integer] [STORAGE storage-clause] [LOGGING| NOLOGGING] [CACHE | NOCACHE]

Page 9: 第十一讲  Oracle 对象管理

PCTFREE 和 PCTUSED PCTFREE 用于指定块中必须保留的最小空闲空间比例; PCTUSED 用于指定当数据块达

到 PCTFREE 参数的限制之后,数据块能够被再次使用前,已占用的存储空间必须低于的比例 INITRANS 和 MAXTRANS 在创建表时, Oracle 将在表中每个数据块的头部空间中分配可以存储 INITRANS 个事务条目的空间。 MAXTRANS 表明一个块所允许的最大并发事务数目

Page 10: 第十一讲  Oracle 对象管理

在 STORAGE 子句中可以设置下面 6 个存储参数: INITIAL , NEXT , PCTINCREASE ,

MINEXTENTS , MAXEXTENTS , BUFFER_POOL :指定表的数据块的缓存池。小且经常被查询的表存放在 KEEP 中;大却很少被访问的表存储在 RECYCLE 里;负责存储在 DEFAULT 里

LOGGING 和 NOLOGGING : 表的创建操作(包括通过查询创建表时的插入记录操作)是否记录到重做日志中。

Page 11: 第十一讲  Oracle 对象管理

建表例子CREATE TABLE employees(empno NUMBER(4), last_name VARCHAR2(30)deptno NUMBER(2))PCTFREE 20 PCTUSED 50STORAGE(INITIAL 200K NEXT 200K

PCTINCREASE 0 MAXEXTENTS 50)TABLESPACE data01;

Page 12: 第十一讲  Oracle 对象管理

复制表例子CREATE TABLE testSTORAGE(INITIAL 200K NEXT 200KPCTINCREASE 0 MAXEXTENTS 50)NOLOGGINGPARALLELTABLESPACE USERSASSELECT * FROM USER_OBJECTS;

Page 13: 第十一讲  Oracle 对象管理

11.1.2 索引组织表( IOT ) 一般情况下,表与索引数据分别存放在表段和索引段中。但索引组织表( IO

T )比较特殊,它将表的数据和索引数据存储在一起,即以 B 树索引的方式来组织表中的数据。

Page 14: 第十一讲  Oracle 对象管理

非键列键列

行头

普通表及其索引 索引组织表

Page 15: 第十一讲  Oracle 对象管理

创建索引组织表 在 CREATE TABLE 语句中必须显式地指定

organization index 关键字。 在索引组织表中必须建立一个 primary key 主码约束。create table employees( empno number(5) primary key, ename varchar2(15) not null, sal number(7,2), job varchar2(10) ) organization indextablespace users;

Page 16: 第十一讲  Oracle 对象管理

11.1.3 分区 分区是指将一张大表的数据进行物理划分,并最终将其数据放到几个相对较小的表分区段中。 当执行 SQL 语句访问分区表时,系统可以直接访问某个表分区段,而不需要访问整张表的所有数据,从而降低磁盘

I/O ,提高系统性能。

Page 17: 第十一讲  Oracle 对象管理

范围分区 范围分区是按照分区字段中值的范围来对表进行分区。范围分区通常用于分区字段是日期类型的表。

Page 18: 第十一讲  Oracle 对象管理

create table sales( customer_id number(3), sales_amount number(10,2), sales_date date) partition by range (sales_date)(partition pl values less than (TO_DATE ('01012001', 'MMDDYYYY')) tablespace tb2001, partition p2 values less than (TO_DATE ('01012002', 'MMDDYYYY')) tablespace tb2002, partition p3 values less than(TO_DATE ('01012003', 'MMDDYYYY')) tablespace tb2003, partition p4 values less than(TO_DATE ('01012004', 'MMDDYYYY')) tablespace tb2004);

Page 19: 第十一讲  Oracle 对象管理

当在分区表上执行 INSERT 操作时,系统会自动按照 sales_date 值的范围将数据插入到相应的分区段上 当执行 SELECT 、 UPDATE 、 DELETE操作时,如果在 WHERE 子句中引用了分区列,那么 Oracle 会自动在相应分区上执行操作,从而降低 I/O 操作的次数,进而提高性能。

Page 20: 第十一讲  Oracle 对象管理

列表分区 如果分区字段的值并不能划分范围(非数字或日期数据类型),同时分区字段的取值范围只是一个包含少数值的集合,那么可以对表进行列表分区。 在进行列表分区时,需要为每个分区指定一个取值列表,分区字段值处于同一个取值列表中的记录被存储在同一个分区中。 列表分区适用于那些分区字段是一些无序的或者无关的取值集合的表。

Page 21: 第十一讲  Oracle 对象管理

create table sales_by_region( deptno number, dname varchar2 (20), quarterly_sales number (10,2), city varchar2(10)) partition by list (city)(partition pl values ('北京 ', ' 上海 ') ,partition p2 values (' 重庆 ', '广州 ') ,partition p3 values ('南京 ', '武汉 ') );

Page 22: 第十一讲  Oracle 对象管理

散列分区 在进行范围分区或列表分区的时候,有时由于用户无法对各个分区中可能具有的记录数目进行预测,可能会产生不平衡分区情况。这时应创建散列分区 散列分区是指按照 Oracle 所提供的散列

(HASH)函数来计算列值数据,并最终按照函数结果来分区数据。

Page 23: 第十一讲  Oracle 对象管理

create table product( product_id number(6), description varchar2(30)) partition by hash (product_id) (partition pl tablespace locall, partition p2 tablespace local2 );

Page 24: 第十一讲  Oracle 对象管理

组合分区 组合分区实际上组合了范围分区和散列分区,它首先按照列值范围从逻辑上进行范围分区,然后在每个范围分区的基础上再按照散列函数进行散列分区。

Page 25: 第十一讲  Oracle 对象管理

create table sales_order( order_id number, order_date date, product_id number, quantity number) partition by range (order_date) subpartition by hash (product_id) subpartitions 2 store in(users,userl) (partition p1 values less than( '01-APR-2001'), partition p2 values less than ('01-JUL-2001'), partition p3 values less than ('01-OCT-2001'), partition p4 values less than ('01-JAN-2002'));

Page 26: 第十一讲  Oracle 对象管理

其中, STORE IN 用于指定散列分区所在表空间。 在执行了上述命令之后,首先按照

ORDER_DATE 列值进行范围分区,此时建立四个逻辑上的范围分区。然后按照 PRODUCT_ID 列值进行散列分区,并将逻辑上的四个范围分区最终转化成8 个物理上的散列分区段。

Page 27: 第十一讲  Oracle 对象管理

11.1.4 簇 一般情况下,建表时 Oracle 会为每个表分配相应的表段。

DEPTNO DNAME LOC10 ACCOUNTING NEW YORK20 RESEARCH DALLAS30 SALES CHICAGO40 OPERATIONS BOSTON

DEPT

DEPTNO DNAME SAL20 SMITH 80010 CLARK 245010 KING 500020 SCOTT 200030 DEVE 1800

EMP

DEPT EMP

Page 28: 第十一讲  Oracle 对象管理

产生的问题 假定用户经常需要执行类似于“ SELECT dname,ename,sal FROM

dept,emp WHERE dept.deptno=emp.deptno AND dept.deptno=10” 的连接查询语句来检索部门及其雇员的相关信息,那么至少需要 2 次的 I/O 操作

Page 29: 第十一讲  Oracle 对象管理

解决方法 Oracle利用簇将多个表的相关字段聚簇在相同的数据块中。

Deptno (簇键) 10 ACCOUNTING NEW YORK CLARK 2450 KING 5000 20 RESEARCH DALLAS SMITH 800 SCOTT 2000

簇 DEPT_EMP

Page 30: 第十一讲  Oracle 对象管理

簇的建立(第一步) 建簇create cluster dept_emp(deptno number (3)) pctfree 20 pctused 60 size 500tablespace users storage ( initial 200K next 200K minextents 3 pctincrease 0 maxextents 50); 注: size 指一个簇键和它相关行所需的平均字节数

Page 31: 第十一讲  Oracle 对象管理

簇的建立(第二步) 建簇表create table dept( deptno number(3) primary key, dname varchar2(14), loc varchar2(13) )cluster dept_emp(deptno);

注:不能指定 STORAGE 子句和块空间使用参数

Page 32: 第十一讲  Oracle 对象管理

簇的建立(第三步) 在插入数据之前必须首先建立簇索引create index dept_emp_idx on cluster dept_emp tablespace indx storage( initial 20K next 20K pctincrease 0);

Page 33: 第十一讲  Oracle 对象管理

11.1.5 表的存储管理 分配空间 默认情况下, Oracle 会根据存储参数设置自动为表分配区并计算大小。若需要指定大小的区,则可使用 ALTER

TABLE ALLOCATE EXTENT 语句以手工方式为表分配存储空间。 alter table department allocate extent (size 500K datafile 'e:\test\users2.dbf');

Page 34: 第十一讲  Oracle 对象管理

释放空间ALTER TABLE [schema.]tableDEALLOCATE UNUSED [KEEP integer[K|M]]

注: KEEP 指定在高水位标记( HIGH WATER MARK ,使用段存储的最高历史记录)以上应该保留的字节数。如果使用上述命令时没有 KEEP 子句, Oracle 将回收高水位标记以上所有未使用空间。

Page 35: 第十一讲  Oracle 对象管理

Free space after deleteFree space after deleteUnused blockUnused block

High water markHigh water mark

Extent IDExtent ID 0 0 11 22 33 44

Extent IDExtent ID 0 0 11 22 33 44

Used blockUsed block

High Water Mark

After insertsAfter inserts

After deletesAfter deletes

Page 36: 第十一讲  Oracle 对象管理

Free space after deleteFree space after deleteUnused blockUnused block

High water markHigh water mark

释放之前释放之前

Used blockUsed block

释放未使用的空间

ALTER TABLE scott.employeesDEALLOCATE UNUSED;

释放之后释放之后0 1 2 30 1 2 3 4 4

Page 37: 第十一讲  Oracle 对象管理

修改存储参数 在表创建之后,可以使用 ALTER TABLE 语句来改变表的块参数设置和部分存储参数设置

( INITIAL 和 MINEXTENTS 不能改)。 ALTER TABLE [schema.]table

[ storage-clause] [PCTFREE integer] [PCTUSED integer] [INITRANS integer] [MAXTRANS integer]

Page 38: 第十一讲  Oracle 对象管理

表的重组 如果发现一个表的数据段具有不合理的区分配方式,但是又不能通过别的方法来调整(改变存储参数不会影响到已经分配的区),可以考虑将该表移到一个新的数据段中。用户可以为新的数据段重新设置存储参数,以便符合表的存储需求。

Page 39: 第十一讲  Oracle 对象管理

例 1 :将 EMPLOYEES 表移动到同一个表空间的新数据段中: alter table employees movestorage(initial 20K next 40K minextents 2 maxextents 20 pctincrease 0);

Page 40: 第十一讲  Oracle 对象管理

例 2 :将 EMPLOYEES 表移动到表空间 USERS02 的新数据段中:

alter table employees movetablespace users02storage(initial 20K next 40K minextents 2 maxextents 20 pctincrease 0);

Page 41: 第十一讲  Oracle 对象管理

11.1.6 表信息查询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

Page 42: 第十一讲  Oracle 对象管理

11.2 索引 11.2.1 B-Tree 索引 11.2.2 位图索引 11.2.3 反键索引 11.2.4 索引管理 11.2.5 索引信息查询

Page 43: 第十一讲  Oracle 对象管理

11.2.1 B-Tree 索引

索引项标题索引项标题关键字列长关键字列长关键字列值关键字列值ROWIDROWID

根根

分支分支

叶叶

索引项索引项

Page 44: 第十一讲  Oracle 对象管理

建立通常的 B-Tree 索引CREATE [ UNIQUE ]INDEX [schema.] index

ON [schema.] table

(column [ ASC | DESC ] [ , column [ASC | DESC ] ] ...)

[TABLESPACE tablespace]

[ PCTFREE integer ]

[ INITRANS integer ]

[ MAXTRANS integer ]

[ storage-clause ]

[ LOGGING| NOLOGGING ]

[ NOSORT ]

Page 45: 第十一讲  Oracle 对象管理

建立 B-Tree 索引的例子CREATE INDEX test_idxON test(a)PCTFREE 30STORAGE(INITIAL 200K NEXT 200K PCTINCREASE 0 MAXEXTENTS 50)TABLESPACE indx;

Page 46: 第十一讲  Oracle 对象管理

建立索引的原则 平衡查询和 DML 需求 放在一个单独的表空间内(非 SYSTEM,

RBS, TABLE ) 使用统一的区大小 ( 经验值: 五块的倍数或表空间 MININUM EXTENT 大小的倍数) 考虑对大索引使用 NOLOGGING 如果新的关键字值有可能位于当前范围内 , 则设置高 PCTFREE

Page 47: 第十一讲  Oracle 对象管理

11.2.2 位图索引row1234

Name

JoeJaneJohnJames

M_Status

SingleMarriedDivorcedMarried

State

PACACAPA

Gender

MFMM

M_Status-IDXSingleMarriedDivorced

State-IDXCAPA

Gender-IDXMF

1 0 0 00 1 0 00 0 1 0

0 1 1 01 0 0 1

1 0 1 10 1 0 0

Select count(*) from customerswhere M_Status = married ANDState = CA AND Gender = M

Page 48: 第十一讲  Oracle 对象管理

B 树适合高基数的列更新关键字列的费用相对较低使用 OR 谓词的查询效率低

对 OLTP 有用

位图适合低基数的列更新关键字列的费用非常昂贵使用 OR 谓词的查询效率高

对数据仓库有用

B-Tree 树与位图索引的比较

Page 49: 第十一讲  Oracle 对象管理

建立 Bitmap 索引 CREATE BITMAP INDEX [schema.] indexON [schema.] table(column [ ASC | DESC ] [ , column [ASC | DESC ] ] ...)[TABLESPACE tablespace][ PCTFREE integer ][ INITRANS integer ][ MAXTRANS integer ][ storage-clause ][ LOGGING| NOLOGGING ][ NOSORT ]注意, Bitmap 不能是 unique 的

Page 50: 第十一讲  Oracle 对象管理

建立 Bitmap 索引的例子SQL> CREATE BITMAP INDEX test_bm_idx 2 ON test(c) 3 PCTFREE 30 4 STORAGE(INITIAL 200K NEXT 200K 5 PCTINCREASE 0 MAXEXTENTS 50) 6 TABLESPACE indx;

索引已创建。

Page 51: 第十一讲  Oracle 对象管理

11.2.3 反键索引

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... ...... ...

Index on EMP (EMPNO)Index on EMP (EMPNO) EMP tableEMP table

EMPNO ENAME JOB ...----- ----- --------7499 ALLEN SALESMAN7369 SMITH CLERK7521 WARD SALESMAN ...7566 JONES MANAGER7654 MARTIN SALESMAN7698 BLAKE MANAGER7782 CLARK MANAGER... ... ... ...... ... ... ...

Page 52: 第十一讲  Oracle 对象管理

适合唯一索引 反键索引有助于把本来相连的列值分散到索引的不同叶块,这样减少了 I/O 的读取个数,从而提高了性能。

Page 53: 第十一讲  Oracle 对象管理

建立反键索引CREATE [ UNIQUE ]INDEX [schema.] index

ON [schema.] table

(column [ ASC | DESC ] [ , column [ASC | DESC ] ] ...)

[TABLESPACE tablespace]

[ PCTFREE integer ]

[ INITRANS integer ]

[ MAXTRANS integer ]

[ storage-clause ]

[ LOGGING| NOLOGGING ]

REVERSE

(注意,这里不能使用 NOSORT )

Page 54: 第十一讲  Oracle 对象管理

建立反键索引的例子SQL> CREATE UNIQUE INDEX test_rsidx 2 ON test(b) REVERSE 3 PCTFREE 30 4 STORAGE(INITIAL 200K NEXT 200K 5 PCTINCREASE 0 MAXEXTENTS 50) 6 TABLESPACE indx;索引已创建。SQL>

Page 55: 第十一讲  Oracle 对象管理

11.2.4 索引管理 修改索引存储参数设置 可以使用 ALTER INDEX命令修改其存储参数。存储参数 INITIAL 不能修改,而修改其他存储参数只对新分配的区起作用。 alter index test_idx storage(next 200k maxextents 50);

Page 56: 第十一讲  Oracle 对象管理

SQL> ALTER INDEX test_bm_idx 2 ALLOCATE EXTENT (SIZE 200K 3 DATAFILE 'E:\ORACLE\ORA92\TEST\INDX01.DBF');索引已更改。SQL> ALTER INDEX test_bm_idx 2 DEALLOCATE UNUSED;索引已更改。SQL>注意:释放 HWM 之上的

分配释放存储空间

Page 57: 第十一讲  Oracle 对象管理

11.2.5 索引信息查询DBA_INDEXESOWNERINDEX_NAMEINDEX_TYPETABLE_OWNERTABLE_NAMEUNIQUENESSTABLESPACE_NAMELOGGINGSTATUS

DBA_IND_COLUMNSINDEX_OWNER INDEX_NAME TABLE_OWNER TABLE_NAME COLUMN_NAME COLUMN_POSITIONCOLUMN_LENGTH

Page 58: 第十一讲  Oracle 对象管理

11.3 完整性约束

ApplicationApplicationcodecode

IntegrityIntegrityconstraintconstraint

((首选首选 ))

DatabaseDatabasetriggertrigger

Table

DataData

Page 59: 第十一讲  Oracle 对象管理

11.3.1 约束的类型 11.3.2 约束的定义 11.3.3 约束的修改 11.3.4 约束的删除 11.3.5 约束的查询

Page 60: 第十一讲  Oracle 对象管理

11.3.1 约束的类型约束NOT NULL

UNIQUE

PRIMARY KEY

FOREIGN KEY

CHECK

说明列不能包含空值列或列的组合 的值唯一列或列的组合 为表的主键该完整性约束保证:对于表的每一行,外键的值必须与父表的主键值匹配,

表中每一行必须满足的特殊条件

Page 61: 第十一讲  Oracle 对象管理

延迟约束( Deferred Constraints ) DML 语句检查非延迟约束

COMMIT

检查延迟约束

Page 62: 第十一讲  Oracle 对象管理

默认情况下, Oracle 在一条 SQL 语句执行完毕后进行约束检查,但是也可以将约束检查的时间延迟到一个事务结束时进行。以保证事务的执行过程不会因为出现违反约束的情况而中断。 不可延迟约束:在定义约束时,默认使

用 NOT DEFERRABLE 关键字 可延迟约束:如果在定义约束时显式地指定了 DEFERRABLE 关键字,则创建的约束是可延迟的。

Page 63: 第十一讲  Oracle 对象管理

11.3.2 约束的定义 建立表时定义约束

SQL> CREATE TABLE emp( 2 id NUMBER(7) 3 CONSTRAINT employee_id_pk PRIMARY KEY 4 DEFERRABLE 5 USING INDEX 6 STORAGE(INITIAL 100K NEXT 100K) 7 TABLESPACE indx, 8 last_name VARCHAR2(25) 9 CONSTRAINT employee_last_name_nn NOT NULL, 10 dept_id NUMBER(7)) 11 TABLESPACE users;表已创建。

Page 64: 第十一讲  Oracle 对象管理

当定义主键约束和唯一约束时, Oracle会自动基于主键列或唯一约束列建立唯一索引。 为了提高数据访问性能, Oracle 建议将表及其索引分布到不同表空间,这时,在定义主键约束或唯一约束时可通过使

用 USING INDEX 子句来指定索引段所在表空间。

Page 65: 第十一讲  Oracle 对象管理

创建表后定义约束SQL> create table department( 2 dept_id NUMBER(7) PRIMARY KEY, 3 dept_name VARCHAR2(25));表已创建。SQL> ALTER TABLE emp 2 ADD(CONSTRAINT employee_dept_id_fk

FOREIGN KEY(dept_id) 3 REFERENCES department(dept_id));表已更改。SQL>

Page 66: 第十一讲  Oracle 对象管理

11.3.3 约束的删除 当删除主键约束或唯一约束之后,会自动删除他们所对应的索引 ALTER TABLE emp DROP CONSTRAINT employee_id_pk; 如果在两张表之间存在主外键关系,那么当删除主表的主键约束时必须带有 CASCADE选项 ALTER TABLE department DROP primary key CASCADE;

Page 67: 第十一讲  Oracle 对象管理

删除表的同时删除约束 DROP TABLE department

CASCADE CONSTRAINTS; 注: CASCADE CONSTRAINTS选项用于指定级联删除。当表与其他表具有主外键关系时,删除主表时必须带有该选项。

Page 68: 第十一讲  Oracle 对象管理

11.3.4 约束的查询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