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

Table(P36-P50)sql

1. 定义数据库

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

  1) Relation Table oracle

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

每一个 Realation Table 是如下三种组织形式之一:性能

a) heap-organized table编码

  table 的默认组织形式spa

b) index-organized table.net

  数据按 primary key 进行组织, 能够搞高性能code

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 Database compares VARCHAR2 values using nonpadded 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 进行加减运算.

 

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

 

7. ROWID Data Types

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

  1) Physical Rowids

    记录存储在heap-organized tables, clustered tables, and table 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

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

  Object Table 指的是每一行为一个 Object Type ;

  :

-- Object Type

CREATE TYPE department_typ AS OBJECT

( d_name VARCHAR2(100),

d_address VARCHAR2(200) );

 

-- Object Table

CREATE TABLE departments_obj_t OF department_typ;

 

INSERT INTO departments_obj_t

VALUES ('hr', '10 Main St, Sometown, CA');

相似Relation Table 中的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,De Haan,LDEHAAN,515.123.4569,13-JAN-01,AD_VP,17000,100,90

External Table 能够提高在数据仓库环境中进行 ETL 任务的性能

 

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

 

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

 

若是 External Table 不是经过ORACLE_DATADUMP access driver CREATE TABLE AS SELECT 来进行建立, 则此 table 是只读的,且不支持index column, virtual column, column object;

 

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

   1) Oracle Loader(默认)

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

   2) Oracle DataDump

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

     能够进行显示的loadunload外部数据

   clip_image002[4]

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通常会按CREATE TABLE 语句中所列出的列顺序来存储各个列,但若是存在类型为 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中的行若是在相同的 data block,则有可能会有相同的 rowid;(???为何)

 

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

 

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

 

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

相关文章
相关标签/搜索