oracle之方案对象简介

oracle之方案对象简介
2011年02月22日
  方案对象简介
  方案(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.其他方案对象,另外开篇介绍....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值