oracle之方案对象简介

 

方案对象简介

 

方案(schema)是一个逻辑数据结构(或称为方案对象(schema object))的集合。每个数据库用户拥有一个与之同名的方案,且只有这一个方案。方案对象可以通过 SQL 语句创建和操作。

 

可以包含于方案的对象类型有: 

簇(cluster) 

数据库链接(database link) 

数据库触发器(database trigger) 

维度(dimension) 

外部过程库(external procedure library) 

索引(index)和索引类型(index type) 

Java 类(Java class),Java 资源(Java resource),及Java 源程序(Java source) 

物化视图(materialized view)及物化视图日志(materialized view log) 

对象表(object table),对象类型(object type),及对象视图(object view) 

操作符(operator) 

序列(sequence) 

存储(在服务器端)的(stored)函数(function),过程(procedure),及包(package) 

同义词(synonym) 

表(table)及 index-organized table 

视图(view) 

 

Oracle 在逻辑上将方案对象存储于数据库的表空间(tablespace)中,而方案对象的数据在物理上存储于此表空间的一个或多个数据文件(datafile)中。

 

1.表概述

表的存储:当用户创建一个表时,Oracle 会自动地在相应的表空间内(tablespace)为此表分配数据段(data segment)以容纳其数据。

注意:创建或修改簇表时不能为其设定存储参数(storage parameter)。一个簇内的所有簇表都使用此簇的存储参数来控制其空间分配。

  行的存储:Oracle 使用一个或多个行片断(row piece)来存储表的每一行数据的前255列。

  当 Oracle 必须使用多个行片断来存储同一数据行时(且每个行片断位于不同的数据块内),此行将在多个数据块间构成行链接(Row Chaining)

  当一个表超过 255 列时,每行第255列之后的数据将作为一个新的行片断(row piece)存储在相同的数据块(data block)中,这被称为块内链接(intra-block chaining)。

  这里注意:不同的块之间的行链接是增大I/O开销,块内链接是不会影响I/O开销(ROWID一致)

 null的存储:为了节约存储空间,如果某列值为空(null),那么数据库中只用1个字节存储其列长(值为 0),而不存储任何数据。对位于一行末尾的空列值(trailing null column),数据库中将列长也忽略不予存储。

 行片内的rowid:每个行片断得到一个 rowid 之后,这个值将会保持不变,直到其所属行被删除(delete)或经过 Oracle 工具导出并再次导入。

 列顺序:一个表的列一般按照建表的顺序存储。例外就是:一个表含有数据类型(datatype)为 LONG 的列,那么 Oracle 会将此列存储在行的末尾。当用户修改了表定义向其中添加了新的列,这些列也将存储在行的末尾。

 NULL列的处理:一般将包含NULL值很多的列放在最后

 表压缩的发生:数据批量插入(bulk insert)或批量加载(bulk load);使用 ALTER TABLE ... MOVE 语句可以将数据库内已有的数据转换为压缩模式。

 与会话相关的临时表:针对与会话相关的临时表(session-specific temporary table)执行的 TRUNCATE 语句只会清除(truncate)属于此会话的数据,而不会清除此临时表中属于其他会话的数据。

 临时表分配空间:Oracle 在创建临时表及临时索引时并不会为其分配段(segment),段是在第一次执行 INSERT(或 CREATE TABLE AS SELECT)语句时进行分配。

 与事务相关的临时表:如果在子事务(child transaction)中对临时表(temporary table)执行了 INSERT 操作,临时表中已有的数据将被清除。

 外部表:默认类型是 ORACLE_LOADER,用户可以使用这种类型从外部表中读取数据并加载到数据库中。

  Oracle 还提供了 ORACLE_DATAPUMP 类型,用户可以使用这种类型先对外部表进行反向加载(unload data),再将其中的数据加载到另一个数据库中。

 

2.视图概述

1.视图与表:所有对视图数据的修改最终都会被反映到视图的基表(base table)中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。

所有对视图的查询最终也是尽可能转化成基表的形式查询,也就是说会尽可能的使用到基表的索引

2.物化视图:一种可以用于汇总,计算,复制,及发布数据的方案对象。她适用于数据仓库,决策支持,分布式计算,及移动计算等多种环境。

 

3.序列

序列的存储:Oracle 将一个数据库中所有序列(sequence)的定义存储在 SYSTEM 表空间内的一个数据字典表中。由于 SYSTEM 表空间总是联机的(online),因此所有序列的定义也总是可用的

序列的使用:同一个序列对象(sequence)为不同的表产生的序列号(sequence number)是相互独立的。

如果用户的应用程序不允许序列号缺失,就不应使用 Oracle 序列。这种情况下,应将序列号保存在数据库表中,但要谨慎处理。

序列断号问题:http://zhang41082.itpub.net/post/7167/496340

 

 

4.同义词

同义词进行以下工作:隐藏一个数据库对象的名字和拥有者;隐藏分布式环境中远程对象的位置;简化数据库用户的 SQL 语句 ;和视图类似能够限制访问,用于实现更精细的访问控制.

 

 

5.索引概述

Oracle 提供了各种类型的索引,她们能够互为补充地提升查询性能: 

平衡树索引(B-tree index) 

平衡树簇索引(B-tree cluster index) 

哈希簇索引(hash cluster index) 

反向键索引(reverse key indexes) 

位图索引(bitmap index) 

位图连接索引(bitmap join index) 

函数索引(function-based index)

域索引(domain index)

约束与索引:Oracle 建议使用 CREATE UNIQUE INDEX 语句显式地创建唯一索引。通过主键或唯一约束来创建唯一索引不能保证创建新的索引,而且用这些方式创建的索引不能保证为唯一索引。

NULL与索引:Oracle 不会将索引列全部为 NULL 的数据行加入到索引中。不过位图索引是个例外,簇键的列值全部为 NULL 时也是例外。

函数索引的存储:函数索引能够计算出函数或表达式的值,并将其保存在索引中。

使用函数索引的条件: 建立索引后,表必须经过分析(analyze);必须保证查询的条件表达式不是 NULL 值, 因为 NULL 值不会被存储到索引中。 

索引的内部操作:当用户创建索引时,Oracle 取得所有被索引列的数据并进行排序,之后将排序后索引值和与此值相对应的 rowid 按照从下到上的顺序加载到索引中。

索引的构成--索引块:

分支块:最小的键值前缀(minimum key prefix),用于在(本块的)两个键值之间做出分支选择;指向包含所查找键值的子块(child block)的指针;

叶块:数据行的键值(key value);键值对应数据行的 ROWID .

逆序键索引:此处的逆序指索引列值(index key value)得各个字节(byte)按倒序排列,而非索引列(index key)逆序排列。

逆序键索引的建立和修改:CREATE INDEX i ON t (a,b,c) REVERSE;ALTER INDEX i REBUILD NOREVERSE;

数据仓库下的位图索引优势:能够减少大数据量自定义查询的响应时间 ;与其他索引技术相比能够节省大量存储空间 ;即使硬件配置较低也能显著提高性能 ;有利于并行 DML 和并行加载

使用位图索引:主要进行大于或小于比较的列,不适宜使用位图索引。例如,WHERE 子句中常会将 salary 列和一个值进行比较,此时更适合使用平衡树索引。位图索引适用于等值查询,尤其是存在 AND,OR,和 NOT 等逻辑操作符的组合时。、

NULL与位图索引:与其他大多数索引不同,位图索引(bitmap index)可以包含键值(key value)为 NULL 的行。

 

  常规表                                                                                 索引表 

 

-------------------------------------------------------------------------------------------------------------------------

 

使用 rowid 唯一地确定一行,主键(primary key)是可选的                          使用主键唯一地确定一行,主键是必须的      

 

ROWID 虚列中存储的是物理 rowid ,可以使用此列建立间接索引                       ROWID 虚列中存储的是逻辑 rowid,可以使用此列建立间接索引

 

对表的访问依据物理 rowid               对表的访问依据逻辑 rowid

 

使用全表扫描(sequential scan)可以返回所有行 使用全索引扫描(full-index scan)可以返回所有行

 

可以作为簇(cluster)中的表 不能作为簇(cluster)中的表

 

可以包含数据类型为 LOB  或 LONG 的列 可以包含数据类型为 LOB 的列,但不能包含数据类型为 LONG 的列

 

 -------------------------------------------------------------------------------------------------------------------------------------------------

索引表中的非键列:可以将不常用的非键列移出索引树,使索引页容纳更多的数据,使用的是行溢出段,

  索引表由于存储了全部数据在索引页块上,会使树比较雍宗,我们可以使用 OVERFLOW 子句解决这个问题。

   将一个数据行分为两部分,分别存储在索引及行溢出段(overflow storage area segment)内。

  一行数据可以被分为如下两部分: 索引项(index entry),其中包含了主键列的全部列值,指向此行溢出部分数据的物理 rowid, 以及用户选定的非键列值

行溢出部分(overflow part),包含了其余非键列的列值

利用 PCTTHRESHOLD 子句,用户可以设定一个数据块容量的百分比值;利用 INCLUDING 子句,用户可以设定一个列名。在 CREATE TABLE 语句中在设定列名之后出现的非键列将被存储到行溢出段中。

间接索引在常规表和索引表的不同表现:

常规表:先扫描间接索引再获取包含所需数据行的数据块;

索引表:依据是否使用物理推测(physical guess),及物理推测的准确度而有所不同: 

a.如不使用物理推测,数据访问需要两次索引扫描:首先扫描间接索引,再依据其结果扫描主键索引(primary key index)。 

b.如使用物理推测且推测结果准确,数据访问需要首先扫描间接索引,再进行 I/O 操作获取包含所需数据行的数据块。 

c.如使用物理推测且推测结果不准确,数据访问需要首先扫描间接索引,并根据物理推测执行 I/O 操作获取了错误的数据块,之后再进 行主键索引扫描。 

 

6.簇

簇的概念:簇由一组拥有相同的列且经常被一起使用的数据表构成,这组表在存储时会共享一部份数据块(data block)

簇的好处:

连接(join)簇表(clustered table)所需的磁盘 I/O 会减少。 

连接簇表所需的时间将减少。 

在一个簇中,簇键值是指各行簇键列)的值。一个簇内的由多个簇表的各个数据行所使用的相同的簇键值,在簇及簇索引中只会被存储 一次。因此与非簇表相比,在簇中存储相关的表及索引所需的存储空间更少。

 

7.其他方案对象类型,另外开篇介绍....

 

 

提一个关于方案对象名称的解析过程:

在 SQL 语句中引用的方案对象名称可由多段(piece)组成,各段之间使用“.”分隔。

以下内容描述了 Oracle 如何解析对象名称: 

1.Oracle 首先验证 SQL 语句中所引用的对象名称的首段。例如在 hr.employees 中,hr 为首段。如果引用的名称只由一段构成,则此段就被看作是首段。   

a.Oracle 首先在当前方案(schema)中搜索名称与对象名首段相符的对象。如果不存在则进入到步骤 b。 

b.Oracle 搜索名称与对象名称首段相符的公有同义词(public synonym)。如果不存在则进入到步骤 c。 

c.Oracle 搜索名称与对象名称首段相符的方案。如果找到一个这样的方案,则返回步骤 b,使用对象名称的第二段在方案中搜索相符 的对象。如果方案中不存在相符的对象,或者引用的对象名称只由一段构成,则 Oracle 将返回一个错误。 

如果在步骤 c 中没有找到相符的方案,那么引用的对象名称也不能被验证,Oracle 将返回一个错误。 

2.如果数据库中存在语句里所引用的方案对象,这个方案对象还必须具备对象名称剩余段所代表的内容。.

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(oracle)