Oracle数据库应用——模式对象论文080311119 邵博伦模式对象介绍模式(schema)是数据的逻辑结构或者说模式对象的汇总。
一个模式对应一个数据库用户,并且名字和数据库用户名相同。
每个用户都有一个单独的模式。
模式对象可以通过SQL 创建(DDL)和操作(DML)。
模式对象是数据的逻辑存储结构。
数据对象和磁盘上保存其信息的物理文件并不一一对应。
Oracle在数据库的一个表空间上保存模式对象。
每个对象的数据物理的保存在表空间的一个或者多个数据文件上。
对某些对象如表、索引、聚集来说,你可以指定在表空间的数据文件上Oracle可以分配多大的磁盘空间来存储这个对象。
模式和表空间没有什么联系:一个表空间可以包换来自不同模式的对象,模式对象可以包含在不同的表空间上。
表概述表是Oracle数据库内数据存储的基本单位。
数据是按照行和列来存储。
你用一个表名(比如employees)、一系列列来定义表。
你为每列指定一个列名(比如employee_id,last_name和job_id等),一个数据类型(比如VARCHAR2,DATE,NUMBER)和一个宽度。
宽度可以是数据类型(比如日期)预先定义好的。
如果列是NUMBER类型,定义范围和精度就可以了。
行是关联到一个记录的列信息的集合。
你可以指定表中每个列的规则。
这些规则叫做完整性约束条件。
NOT NULL就是一个完整性约束的例子。
这个约束条件要求这列的每一行都要包含一个值。
你还可以指定表列在保存在数据文件之前将数据加密。
加密阻止了越过数据库访问控制来直接使用操作系统工具查看数据文件的现象。
在你创建表之后,使用SQL语句插入行数据。
表的数据就可以使用SQL查询、删除和更新。
表的建立:SQL>CREATE TABLE jxzy.switch(>OFFICE_NUM NUMBER(3,0) NOT NULL,>SWITCH_CODE NUMBER(8,0) NOT NULL,>SWITCH_NAME VARCHAR2(20) NOT NULL);表的修改:SQL>ALTER TABLE jxzy.switch>ADD (DESC VARCHAR2(30));表的删除:SQL>DROP TABLE jxzy.switch>CASCADE CONSTRAINTS表的压缩:Oracle的表压缩特性通过减少数据块中重复值来压缩数据。
数据块(磁盘页)中保存的压缩数据是自包含的。
就是说,一个数据块中需要重新创建解压缩的所有数据信息对本数据块是可用的(一个块上的信息需要解压缩才能读取,但同样的信息在另一块上不需要)。
一个块上的所有行和列的重复值都在块开始的地方保存一次,这个地方也叫块的符号表。
这些(重复)值出现的地方都替代为指向符号表的链接。
除了开始的符号表之外,压缩数据库块看起来和通常数据库块非常类似。
适用于通常数据库块的所有数据库特性和函数也适合压缩数据库块。
包括表和实体化视图的数据库对象都可以压缩。
对于分区表来说,你可以选择压缩部分或者全部分区。
压缩属性可以用在表空间、表或者分区表。
如果在表空间级别声明压缩属性,那么其上创建的所有表默认都是压缩的。
你可以修改一个表(或者表空间、分区表)的压缩属性,但只对新加入表的数据有效。
因此,一个表或者分区可能同时包含压缩块和正常块。
这样确保数据大小不能因为压缩而增加;在压缩会增加块使用时,块不会使用压缩。
完整性约束管理数据库数据的完整性指数据的正确性和相容性。
数据完整型检查防止数据库中存在不符合语义的数据。
完整性约束是对表的列定义一组规则说明方法。
ORACLE提供如下的完整性约束.NOT NULL 非空PRIMATY KEY 主键一个表只能有一个,非空UNIQUE 唯一关键字CHECK 表的每一行对指定条件必须是true或未知(对于空值)FOREIGA KEY 外键唯一性约束(Unique constraint)唯一性约束可以保护表中多个数据列,保证在保护的数据列中任何两行的数据都不相同。
唯一性约束与表一起创建,在唯一性约束创建后,可以使用ALTER TABLE语句修改。
●语法:●某列定义非空约束:SQL>ALTER TABLE office_organization>MODIFY(desc VARCHAR2(20)>CONSTRAINT nn_desc NOT NULL)●某列定义唯一关键字:SQL>ALTER TABLE office_organization>MODIFY(office_name VATCHAR2(20)>CONSTRAINT uq_officename UNIQUE)●定义主键约束,主键要求非空:SQL>CREATE TABLE switch(switch_code NUMBER(8)>CONSTRAINT pk_switchcode PRIMARY KEY,)●使主键约束无效:SQL>ALTER TABLE switch DISABLE PRIMARY KEY●定义外键:SQL>CREATE TABLE POLE(pole_code NUMBER(8),>office_num number(3)>CONSTRAINT fk_officenum>REFERENCES office_organization(office_num)>ON DELETE CASCADE);●定义检查:SQL>CREATE TABLE office_organization(>office_num NUMBER(3),>CONSTRAINT check_officenum>CHECK (office_num BETWEEN 10 AND 99);注意用户不能删除在有外部键指向的表的唯一性约束。
这种情况下用户必须首先禁用或删除外部键(foreign key)。
删除或禁用唯一性约束通常同时删除相关联的唯一索引,因而降低了数据库性能。
经常删除或禁用唯一性约束有可能导致丢失索引带来的性能错误。
要避免这样错误,可以采取下面的步骤:1、在唯一性约束保护的数据列上创建非唯一性索引。
2、添加唯一性约束主键(Primary Key)约束表有唯一的主键约束。
表的主键可以保护一个或多个列,主键约束可与NOT NULL约束共同作用于每一数据列。
NOT NULL约束和唯一性约束的组合将保证主键唯一地标识每一行。
像唯一性约束一样,主键由B-tree索引增强。
创建主键约束使用CREATE TABLE语句与表一起创建,如果表已经创建了,可以使用ALTER TABLE语句。
索引概述索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。
因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。
●索引的建立:SQL>CREATE INDEX jxzy.idx_switch>ON switch(switch_name)>TABLESPACE jxzy;●索引的修改:SQL>ALTER INDEX jxzy.idx_switch>ON switch(office_num,switch_name)>TABLESPACE jxzy;●索引的删除:SQL>DROP INDEX jxzy.idx_switch;Oracle还支持函数索引和指定应用程序或使用范围的域索引。
增加或者减少索引并不需要修改任何的SQL语句的语法。
索引只是数据的快速访问途径。
它只影响执行速度。
假定一个数据被索引,索引就会直接指向包含这个值的行的位置。
索引在逻辑上和物理上都和关联表的数据独立。
你可以任何时候创建和删除索引而不会影响基表以及其他的索引。
如果你删除索引,所有的应用程序可以继续运行。
但是,以前访问删除的索引的数据会降低速度。
索引是一个独立的结构,还是需要存储空间的。
索引创建后Oracle自动维护和使用索引。
不需要用户额外操作,Oracle会自动将数据改变(比如增加行、修改行或删除行)反映到相关索引上。
索引数据的获取性能基本保持一致,甚至增加了新行也是如此。
但是一个表上存在多个索引还是会降低更新、删除和插入的性能,因为Oracle必须更新表的相关索引。
优化器可以使用现存的索引来构建另一个索引。
这样会创建一个更快的索引。
唯一和非唯一索引索引可以是唯一或者非唯一的。
唯一索引保证表在索引列(一个或多个)没有重复的行值。
非唯一索引并不强迫限制列值(唯一)。
Oracle推荐显示的使用CREATE UNIQUE INDEX语句来创建唯一索引。
通过主键或唯一约束来创建唯一索引并不一定会创建新索引,而且创建的索引也不确保是唯一索引。
复合索引复合索引(也叫关联索引)是一个在一个表的多个列上创建的索引。
复合索引的列可以是任何顺序的,并且不需要在表中相邻。
在SELECT语句的WHERE子句引用了复合索引的全部或者起始列的情况下,复合索引可以加快获取数据的速度。
因而,定义中使用的列的顺序非常重要。
通常,最常访问或最高选择率的行放在前面。
索引的内部结构Oracle使用B树索引来加快数据访问。
没有索引的情况下,你不得不依次扫描数据来找到值。
对于n行来说,平均的查询行数为n/2。
这个不会随着数据量的增加而缩放。
考虑将一个值的排序列表分成多个块宽度的范围(页块)上。
块的末尾除了块的指针之外都可以保存在一个搜索树中,n条数据花费log(n)的时间就可以找到。
这就是Oracle索引隐含的基本原理。
图5-7 B树索引的内部结构B树索引的较高的块(树枝块)包含指向低级别索引块的索引数据。
最低级别的索引块(叶块)包含每个索引数据和用来定位实际行的对应的rowid。
页块是双向关联的。
索引列的包含的字符集数据是基于数据库的字符集的二进制字符。
对于唯一索引,每个数据值对应一个rowid。
对于非唯一索引,排序序列中包含rowid,所以非唯一索引通过索引键和rowid排序。
包含null的所有键值不索引,除非是聚集索引。
两行都包含null,不违反唯一约束(因为Null是互不相同的)。
索引属性有两种类型的块:搜索使用的树枝块页块保存的值树枝块树枝块保存下列内容:两个键之间需要用来分叉的最小键前缀指向包含键值的子块如果块拥有n个键,,那么它们包含n+1个指针。
键和指针的数量由块大小限制。
页块所有的页块到根块的高度都相同。
页块保留下列信息:每行的全部键值表行的ROWID所有的键和ROWID对都是左右相连的。
他们按照(key,ROWID)排序。
B树结构的优势B树结构有如下优势:树的所有页块高度相同,所以获取索引上任何地方的任何数据所需的时间大致相同B树索引自动保持均衡状态B树索引的所有块平均来说是3/4满的B树对大多数查询提供了优秀的检索性能,包括精确识别和范围搜索插入、更新和删除都是高效的,并维护键顺序以便快速的获取数据B树索引对于小表和大表同样优秀,并且不会随着表尺寸的增长而降低性能索引唯一扫描索引唯一扫描是最高效的访问数据方式之一。