表和表簇
模式对象简介
数据库模式,是被称为模式对象的数据结构的逻辑容器。 举例来说,表和索引即是模式对象。 模式对象通过SQL来创建和操作。
数据库用户具有口令并拥有各种数据库的权限。 每个用户拥有一个单一的模式,此模式与用户具有相同的名称。模式包含相应用户的全部数据。 例如,hr用户拥有hr模式,此模式包含如雇员表之类的模式对象。 在生产数据库中,一个数据库模式的拥有者通常表示一个数据库应用程序,而不是一个人。
模式对象类型
在关系数据库中,最重要的模式对象是表。 表以行的形式存储数据。
Oracle SQL 使您能够创建和操作许多其他类型的模式对象,包括以下这些:
索引,索引是一种模式对象,对于每一个被索引的表行或表簇行,索引都包含一个条目 ,以提供直接、 快速的存取。 Oracle 数据库支持几种类型的索引。 一个索引组织表是一个表,其数据以一个索引结构来存储。
分区,分区是大型表和索引的分片。 每个分区有其自己的名称,并可能有其自己(可选)的存储特征。
视图,视图是对一个或多个表、或其他视图中的数据的自定义表示。 你可以把它们看作存储的查询。 视图实际上并不存储数据。
序列,序列是一个由用户创建的对象,可以被多个用户共享,用于生成整数。 通常,序列用于生成主键值。
维度,维度定义多个列集之间的父-子关系,列集中的所有列必须都来自同一个表。维度通常用于对客户、 产品、和时间之类的数据进行分类。
同义词,同义词是另一个模式对象的别名。 因为同义词只是一个别名,它在数据字典中除了其定义之外,没有存储。
PL/SQL子程序和包,PL/SQL 是Oracle 对SQL的过程化扩展。 PL/SQL 子程序是命名的 PL/SQL 块,可以带参数调用。 PL/SQL 包用于将逻辑上相关的 PL/SQL 类型、 变量、和子程序进行分组。
还有一些其他类型的对象也存储在数据库中,并以SQL语句来创建和操作,但不包含在模式中。 这些对象包括数据库用户、 角色、 上下文、和目录对象。
模式对象存储
一些模式对象将数据存储在称为段的逻辑存储结构中。例如,一个未分区的堆组织表或索引会创建一个段。 其他模式对象,如视图和序列,则只包含元数据。 这一节仅描述有段的模式对象。
Oracle 数据库逻辑上将模式对象存储在表空间中。 在模式和表空间之间没有任何的关系: 一个表空间可以包含来自不同的模式的对象,一个模式中的对象也可以包含在不同的表空间中。 每个对象的数据在物理上包含在一个或多个数据文件中。
模式对象依赖
一些模式对象会引用其它对象,这就产生了模式对象依赖。 例如,一个视图包含一个引用表或其他视图的查询,或一个 PL/SQL 子程序调用其他子程序。 如果对象 A 的定义引用了对象 B,那么 A 相对于B来说是依赖对象,或B相对于A来说是被引用对象。
Oracle 数据库提供了一种自动的机制,以确保依赖对象对于相应的被引用对象来说始终是最新的。 当依赖对象产生后,数据库将跟踪依赖对象和其被引用对象之间的依赖关系。当被引用对象的更改可能会影响依赖对象时,依赖对象被标记为无效。 例如,当用户删除一个表,所有基于这个被删除表的视图都将变得不可用。
SYS和SYSTEM模式
所有 Oracle 数据库都包括默认管理帐户。管理帐户享有很高的特权,仅用于授权的数据库管理员执行诸如启停数据库、 管理内存和存储、 创建和管理数据库用户等任务。SYS管理帐户在创建数据库时自动创建。 此帐户可以执行所有的数据库管理功能。SYS模式存储数据字典基表和视图。 这些基表和视图对数据库的运行至关重要。 SYS模式中的表只由数据库操作,绝不能被任何用户修改。
在创建数据库时,也会自动创建 SYSTEM 帐户。 SYSTEM模式存储其它一些用于显示管理信息的表和视图,以及用于各种数据库选项和工具的内部表和视图。 永远不要使用SYSTEM模式来存储非管理性用户的表。
表概述
表是 Oracle 数据库中的数据组织的基本单位。 一个表描述了一个实体,其相关重要信息必须被记录。
Oracle 数据库表分为以下几个基本类别:
关系表, 关系表具有简单的列,是最常见的表类型。
对象表, 列对应于对象类型的顶层属性。
您可以创建一个具有下列组织特征的关系表:
堆组织表,它不会以任何特定顺序存储行。 默认情况下,CREATE TABLE 语句创建堆组织表。
索引组织表,它按主键值对行进行排序。 对于某些应用程序,索引组织表可以增强性能并更有效地使用的磁盘空间。
外部表,是一个只读表,它的元数据存储在数据库中,但其数据存储在数据库外。
表要么是永久的,要么是临时的。 永久表的定义和数据保持跨会话存在。 临时表的定义与永久表有相同的存在方式,但其数据仅在一个事务或会话的持续期间有效。临时表可用于暂存某些应用程序在运行过程中由多个操作所生成的中间结果集。
列和行
表的定义包括表名称和列集。 列标识由表所描述的实体的一个属性。一般地,当您将创建一个表时,给每列一个列名称、 数据类型、和宽度。表可以包含虚拟的列,与非虚拟列不一样,虚拟列不占用磁盘空间。 数据库通过计算一组用户指定的表达式或函数,按需派生出虚拟的列值。 例如虚拟列income可能是salary列和 commission_pct 列的一个函数。
创建一个表后,可以使用 SQL插入、 查询、 删除、和更新行。 行是对应于表中某条记录的列信息的集合。
Oracle数据类型
每个列都有一种数据类型,这与特定的存储格式、限制、和有效的值范围相关联。 一个值的数据类型与一组固定的属性相关联。 这些属性会使Oracle数据库区别对待不同数据类型的值。
在创建表时,您必须为每个列指定数据类型。 随后在该列中插入的每个值都假定为该列的数据类型。
Oracle 数据库提供了几种内建的数据类型。 最常用的数据类型分为以下几类:
字符数据类型
数字数据类型
日期时间数据类型
ROWID数据类型
格式模型和数据类型
其他几种重要的内建类型包括RAW、大对象 (LOB)、 和集合。 PL/SQL 具有用于常量和变量的数据类型,包括布尔、 引用类型、 复合类型 (记录) 、和用户定义类型。
字符数据类型
字符数据类型存储在字符串中的字符 (字母或数字) 数据。 最常用的字符数据类型是 VARCHAR2,它是用于存储字符数据的最有效的选项。
与字符编码模式相对应的字节值,一般称为字符集或代码页。 数据库字符集是在数据库创建时建立的。字符集的例子有7 位 ASCII码、 EBCDIC码、和 Unicode utf-8。
字符数据类型的长度语义可以以字节或字符为单位。 字节语义将字符串视为一个字节序列。 这是字符数据类型的默认值。 字符语义将字符串视为字符序列。 一个字符在技术上是数据库字符集的编码点。
数字数据类型
Oracle数据库的数字数据类型存储固定和浮点数字、零、或无穷。某些数值类型也可以存储未定义操作的结果值,叫做"非数字"或NAN。
Oracle 数据库以变长格式存储数字数据。用科学计数法存储值,其中一个字节用于存储指数。数据库使用最多 20 个字节存储尾数,即浮点数的有效位数部分。Oracle 数据库不会存储前导零和结尾零。
日期时间数据类型
日期时间数据类型包括DATE和 TIMESTAMP。Oracle 数据库为时间戳提供全面的时区支持。数据库在内部将日期存储为数字。日期被存储为固定长度的域,共7 个字节,分别对应世纪、 年、 月、 日、 小时、分、和秒。
Rowid数据类型
存储在数据库中的每一行都有一个地址。Oracle 数据库使用 ROWID 数据类型存储在数据库中的每一行的地址 (rowid)。Rowids 分为以下几类:
物理 rowids 存储堆组织表、 表簇、表分区、和索引分区中的行地址
逻辑 rowids 存储索引组织表中的行地址
外部 rowids 是外来表(如通过网关访问的DB2表)中的标识符。他们不是标准的Oralce数据库 rowids。
有一种数据类型称为通用rowid 或 UROWID,支持各种 rowids。
Oracle 数据库在内部使用 rowids用于构造索引,最常见的 B 树索引,包含一个被划分成多个键范围的排序列表。每个键都与一个指向关联的行地址的 rowid 相关联,用于快速访问。最终用户和应用程序开发人员也可以使用rowids 的几个重要功能:
Rowids 是访问特定行的最快方式。
Rowids 提供了查看表的组织方式的能力。
Rowids 是给定表中的行的唯一标识符。
ROWID伪列
Oracle 数据库中的每个表都有一个名为 ROWID 的 伪列。 伪列类似于表列,但实际上并不存储在表中。您可以从伪列中选择数据,但不能插入、 更新、或删除它们的值。伪列也类似于不带参数的 SQL 函数。不带参数的函数对于结果集中的每一行通常返回相同的值,而伪列通常为每个行返回不同的值。
ROWID 伪列的值是表示的每个行的地址的字符串。这些字符串具有的数据类型 ROWID。在执行 SELECT 或 DESCRIBE列出表的结构时,此伪列并不显示,它也不占用空间。但是,每个行的 rowid 可以通过使用保留字 ROWID 作为列名的 SQL 查询来检索。
格式模型与数据类型
格式模型是一个字符文本,用来描述存储在一个字符串中的日期时间或数值数据的格式。格式模式不会更改数据库中的值的内部表示形式。
完整性约束
完整性约束是一种命名规则,用于限制一个或多个表中的列值。这些规则可以防止向表中输入无效数据。此外,约束也可以防止当存在某些依赖项时删除表中的数据。
如果启用了约束,则输入或更新数据时,数据库会检查数据。不符合该约束的数据会被阻止输入。如果禁用了约束,则不符合该约束的数据可以被允许输入数据库。
对象表
Oracle 对象类型是具有名称、 属性、和方法的用户定义类型。对象类型使得对现实世界中的实体(如客户和采购单等),作为对象在数据库中进行建模成为可能。对象表是一种特殊的表,其中每一行表示一个对象。
临时表
Oracle 数据库的临时表,用于存放只存在于某个事务或会话期间的数据。临时表中的数据是会话私有的,这意味着每个会话只可以查看和修改自己的数据.临时表对于必须缓冲中间结果集的应用程序非常有用。例如,一个计划应用程序使学生可以创建可选的学期课程计划。每个课程计划由临时表中的一行表示。在会话期间,课程计划数据是私有的。当某个学生确定了课程计划,应用程序会将其所选计划移入永久表。在会话结束时,临时表中的课程计划数据将被自动删除。。
临时表中的段分配
与永久表类似,临时表被定义在数据字典中。但是,临时表和他们的索引不会在创建时自动分配段。相反,临时段是在第一次插入数据时分配的。在一个会话中加载数据之前,表显示为空。对特定事务的临时表,临时段在事务结束时释放空间,而对特定于会话的临时表,在会话结束时释放空间。
外部表
外部表访问外部数据源中的数据,如同此数据是在数据库中的表中一样。您可以使用 SQL 、 PL/SQL、和 Java 查询外部数据。
表存储
Oracle 数据库使用表空间中的数据段保存表数据。如"用户段"所述,段包含由数据块组成的扩展盘区。表数据段(或涉及表簇时的簇数据段)位于表所有者的默认空间中,或 CREATE TABLE 语句中所指定的表空间中。
表组织
默认情况下,表按堆的形式来组织数据,这意味着数据库将行存放在最适合他们的位置,而不是按用户指定的顺序来存放。因此,堆组织表是一个无序的行的集合。当用户往其中添加行时,数据库将行置于在数据段中第一个可用的空闲空间。不能保证行按照插入它们的顺序进行检索。
行存储
数据库将行存储在数据块中。在表中,少于 256 个列的行,被存储在一个或多个行片中。
数据库尽可能将每一行作为一个行片来存储。但是,如果所有的行数据不能插入到一个单一数据块中,或者对现有的行的更新导致行溢出,则数据库使用多个行片来存储此行
行片Rowids
rowid 实际上是行的一个 10 字节的物理地址。如"Rowid 数据类型"中所述,堆组织表中的每一行都有一个在该表中唯一的rowid,与一个行片的物理地址相对应。对于表簇,处于同一个数据块的不同表中的行可以有相同的 rowid。
Oracle 数据库在内部使用 rowids来构建索引。例如,在 B 树索引中的每个键与一个指向关联行地址的rowid相关联,以便快速访问。物理 rowids 提供对表行尽可能最快的访问,使数据库几乎只需单次 I/O就可以检索到行。
表压缩
数据库可以使用表压缩来消除数据块中的重复值。对于数据高度冗余的表,压缩可以节省磁盘空间,减少数据库高速缓存中的内存使用,并在某些情况下可以加快查询执行速度。表压缩对数据库应用程序是透明的。
基于字典的表压缩提供了很好的压缩率。Oracle 数据库支持以下类型的表压缩:
基本表压缩,这种类型的压缩只能压缩由直接路径加载插入的数据,只支持有限的数据类型和 SQL 操作。
OLTP表压缩,这种类型的压缩用于 OLTP 应用程序,并可压缩任何 SQL 操作的数据。
表簇概述
表簇是一组表,它们共享公共的列,并将相关的数据存储在相同的数据块中。当表被聚簇时,单个数据块可以包含多个表中的行。例如,一个块可以同时存储来自employees表和departments表的行,而不只是单个表中的行。
簇键是所有被聚簇的表的共有列或列集。例如,employees表和departments表共享 department_id 列。您在创建表簇时,和创建被添加到表簇的每个表时,指定簇键。
簇键值是一组特定行的簇键列的值。包含相同簇键值的所有数据(例如department_id=20),物理上存储在一起。每个簇键值在簇或簇索引中只存储一次,而无论在这些不同表中有多少行包含这个值。
如果多个表主要是被查询 (而不是修改) ,且各表中的记录是经常被一起查询或联接,在这些情况下可以考虑将他们聚簇化。因为表簇将不同表中的相关行存储在同一个数据块中,被正确使用的表簇相比非聚簇表具有下列优点:
对于被聚簇表的联接,可以减少磁盘 I/O。
对于被聚簇表的联接,可以提高访问速度。
只需更少的空间来存储相关的表和索引数据,因为簇键值不会为每行重复存储。
通常,簇表不适合以下情况:
会经常被更新的表。
经常需要全表扫描的表。
需要被截断的表。
索引化表簇概述
索引化聚簇是使用索引来查找数据的表簇。而簇索引是一个簇键上的 B 树索引。簇索引必须先被创建,然后才能将行插入到簇表中。
哈希簇概述
除了索引键被替换为一个哈希函数之外,哈希簇就像一个索引化聚簇。它没有单独的簇索引存在。对一个哈希簇来说,数据本身就是索引。
对已索引的表或索引化聚簇,数据库用存储在一个单独的索引中的键值查找表行。要查找或存储已索引的表或索引化聚簇中的一个行,数据库必须执行至少两个 I/O 操作:
为查找或存储在索引中的键值,需要一个或多个I/O
为读取或写入表或表簇中的行,还需要一个 I/O
为查找或存储在哈希簇中的一个行,数据库将哈希函数应用到行的簇键值。得出的哈希值对应到一个聚簇中的数据块,数据库则按发出的语句读写该块。哈希是一种可选的表数据存储方法,用来提高数据检索的性能。在满足以下条件时,哈希簇可能是有益的:
经常被查询,但不经常被修改的表。
哈希键列经常使用等值条件查询
哈希簇变体
单表哈希簇是哈希簇的一个优化版本,一次只支持一个表。哈希键和行之间存在一一映射。当用户需要通过主键快速访问表时,单表哈希簇会很有用。
排序哈希簇存储哈希函数的每个值对应的行,通过某种方式,数据库可以有效地把他们按已排定的顺序返回。数据库在内部执行优化的排序。对于需要总是按排定顺序来消费数据的应用程序,这种技术可能会更快的检索到数据。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25427762/viewspace-1064963/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25427762/viewspace-1064963/