博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

《Oracle Database Concepts 11g Release 2》读书笔记(2)-table

Posted on 2011-11-09 22:34  古帆  阅读(667)  评论(0编辑  收藏  举报

(P36-P50)

1. 定义

  Table 是 oracle中数据的基本组成单位. Oracle中定义了两种类型的 Table:

  1) Relation Table

     最常用的 table 类型,列由基本数据类型组成.

     每个 RealationTable 是以下三种组织形式之一:

     a) heap-organized table

         table 的默认组织形式

    b) index-organized table

       数据按 primarykey 进行组织, 可以搞高性能

    c) external table

       只读, 数据仓库中常用


  2) Object Table

      Table 中的某一列的数据类型是 table 对象

 

 

 从存储形式来分, Table 可以分为两种 Table:

  1) permanent table

       常用的 table

  2) temporary table

      其创建与数据操作同 permanent table 相一致;但只有同一个 transaction 或 session 中才可见.

 

2. Columns

  table 中的 column 包括两种:

  1) nonvirtual column

      常用的 column

  2) virtual column

     即表达式/function,不占表空间, 在 select 时进行计算, 并返回结果.

 

3. CHAR 和 VARCHAR2

如果字段类型为 CHAR, 当输入的数据长度不足时,oracle 会补空格至字段长度.

如果字段类型为 VARCHAR2, 则输入的长度为多少, 就使用多少.

 

Oracle 比较 VARCHAR2 字段时, 是直接进行比较; 而比较 CHAR 字段时, 则是先补空格,使其长度与字段长度一致, 然后进行比较(Oracle Databasecompares VARCHAR2 values usingnonpadded comparison semantics and compares CHAR values using blank-padded comparison semantics)

 

4.NCHAR 和 NVARCHAR2

  对应于 CHAR 和 VARCHAR2, 只是其中存放的数据为 Unicode 编码

 

5. Numeric Data Types

  (未细看)

 

6. Date

  Oracle 内部以7个字节的整数形式存储 Date 类型数据, 分别与’世纪’,’年’,’月’,’日’,’时’,’分’,’秒’相对应.

 

  Date 支持数字运算, 所以 Date 类型字段可以与 number 进行加减运算.

 

  格式化时, RR与YY都是返回year 的最后两位;但对于RR来说,09代表的是2009,对于YY来说,RR代表的是1909.

 

7. ROWID Data Types

  Oracle 使用 rowid 来记录数据库中每一行的地址, 共分为三种类型的 rowed:

  1) PhysicalRowids

    记录存储在heap-organized tables, clustered tables, andtable and index partitions.里的行的地址

  2) Logical Rowids

    记录存储在 index-organized tables 里的行的地址

  3) Foreign Rowids

    在 foreign tables 里定义, 不是标准的 oracle rowed

 

  Oracle 内部使用 rowid 来建立索引, 通过 rowid 可以快速的访问指定行; 在客户端使用 rowid 有以下三个好处:

  1) rowid是访问指定行的最快方式

  2) rowid可以反映表的组织形式(是 heap-organized 还是 index-organized)

  3) rowid可以唯一标记指定表中的某一行(对于聚簇表来说,不同表间的行的rowid有可能一样)

 

  可以在创建表时指定某一列为ROWID类型,对此列的操作与其他列相一致.(我试了,可以指定某一列的类型为 ROWID ,但是并不能往此列插数据, 为何?)

 

  Oracle中的每张表都有一个名为 Rowid 的伪列, 用于记录每行的直址, 其数据类型为 ROWID; 这一列类似于一个不带参数的 function 指定的 virtual column, 故其不占用表空间; 此列只能 select, 不能 insert, update, delete.

 

 

8. Object Table

  ObjectType 是用户定义的类型,包括名称,属性,方法; Object Type 属于数据库的逻辑结构,不占用存储空间;

  ObjectTable 指的是每一行为一个 Object Type 的表;

  例:

 

类似RelationTable 中的Rowid, 在 Object Table 中的每一行, 由一个隐藏列 OID 来唯一标记

 

9. Temporary Table

Temporary Table 在一个 transaction/session 里进行创建, 在 transaction/session 结束时会被自动删除, 在 transaction/session 里创建的 temporary table 仅此 transaction/session可见.

场景:

在一个选课程序中, 每个学生对应一个 session, 每条选课记录都存在一个 Temporary Table 里, 学生可以通过对此 Temporary Table 表来进行增删改来修正他的选择,直至最后确定课表时, 才将其写入 Permanent Table 里.

 

  通过 CREATE GLOBAL TEMPORARY TABLE 来创建一个 Temporary Table. 在 ON COMMIT 子句中指定表中的数据是 transaction-specific(默认) 或者是 session-specific.

  例: ()

 

与其他关系数据库的实现不同, Oracle 在创建 Temporary Table 时, 在 data directory 里有 static definition; 表在初始创建时为空, 直到用户插入数据; 因为Temporary Table 有 static definition,所以可以在上面创建index,trigger,view;当然这些也同样是 temporary的,且与table有相同的transaction/session scope;

 

虽然 temporary table 在 data directory 里有 static definition, 但是在表创建时并不分配空间,而是在插入数据时才进行空间分配.对于transaction-specific 类型的 temporary table,其空间在 transaction 结束时释放; 对于 session-specific 类型的 temporary table, 其空间在 session 结束时释放.

 

10. External Table

     External Table 使用户可以像访问一张普通数据库表一样访问一个外部文件(类似以下数据的text文件)

     100,Steven,King,SKING,515.123.4567,17-JUN-03,AD_PRES,31944,150,90

     101,Neena,Kochhar,NKOCHHAR,515.123.4568,21-SEP-05,AD_VP,17000,100,90

     102,Lex,DeHaan,LDEHAAN,515.123.4569,13-JAN-01,AD_VP,17000,100,90

     External Table 可以提升在数据仓库环境中进行 ETL 任务的性能


创建一个External Table 时,会在 datadirectory 里添加对应的 meta data, 但此meta data并不描述存储在表里的数据,也不描述数据是如何存储在外部文件的,而是描述ExternalTable该如何展示外部文件中的数据.

 

创建语句CREATE TABLE ... ORGANIZATION EXTERNAL包含了两部分信息:第一部分描述了各个列及其类型,类似于view;第二部分描述了external data 是如何映射到各个列的.

 

如果 External Table 不是通过ORACLE_DATADUMP access driver 的 CREATE TABLE ASSELECT 来进行创建, 则此 table 是只读的,且不支持index column, virtual column, column object;

 

External Table Access Drivers 是一套将外部数据解释给数据库的API,共分为两种:

   1) Oracle Loader(默认)

     只读,不能进行 create,update, insert 操作

   2) Oracle DataDump

     允许用户向external table 插入数据,但当 externalfile 创建后,数据库不能再向其内插入数据或进行 update(只能在创建时插入数据?)

     可以进行显示的load和unload外部数据

  

11. Table Storage

   Oracle使用 data segment 来保存table中的数据.Oracle内部的数据组成单位依次为: data blocks->extents->data segment.

   Table 的 segment包含在此 table 的拥有者的默认 namespace 中或在 CREATE TABLE 时指定的 namespace中.

   Oracle 中的 table 默认以heap-organized的形式来存储数据,每一行在的插入位置是segment中找到的第一个可用的空闲空间,所以oracle不保证用户所查出的数据与其插入顺序相一致.

 

   Table 在创建时, oracle一般会按CREATETABLE 语句中所列出的列顺序来存储各个列,但如果存在类型为 LONG 的列,此无将会被置在最后面;如果新增一列,则此列将会被存储在最后面.

 

   Table 中可以包含 Virtual Column,此 column不分配磁盘空间,oracle在执行查询语句时按一个表达式或function来计算出此column 的值.对virtual column,用户可以执行以下操作: index, collect statistics, create integrity constraints.

 

   Oracle 中的row存储在data block里, 每个row都少于256 列, 并存储在一个或多个 row pieces 里.(这里的 row pieces 应该等价于 data blocks)

 

   Table cluster 与 nontableclustered table中的row所包含的信息基本一致,但是 table cluster 中的row多包含其所属的cluster key.(????不明白, 后面再看 table cluster)


   Oracle中的rowid 包含10个字节, 在 heap-organized table中用于唯一指定 row 的物理地址; 在table cluster 中,不同table中的行如果在相同的 datablock中,则有可能会有相同的 rowid;(???为什么)

 

   Oracle 内部使用rowid来实现 index;例如,在B-Tree中的每个 key 都由rowid所组成,通过此rowid,可以最快速度的访问指定行.

 

   Table Compression(未细看, 主要应用于OLTP中)

 

   NULL 指的是一列数据 missing,unknown, inapplicable.在一行中,两个不为NULL的列中的NULL列,将会占用1个字节,用以存储此列的长度.如果一行的最后两个列都为NULL, 则此两例不分配存储空间.