读书笔记(2)..."/>
oracle rowed,《Oracle Database Concepts 11g Release 2》读书笔记(2)...
Table(P36-P50)sql
1.定义数据库
Table是oracle中数据的基本组成单位. Oracle中定义了两种类型的Table:session
1) Relation Tableoracle
最经常使用的table类型,列由基本数据类型组成.app
每一个Realation Table是如下三种组织形式之一:性能
a) heap-organized table编码
table的默认组织形式spa
b) index-organized table
数据按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 comparesVARCHAR2values using nonpadded comparison semanticsand comparesCHARvalues 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) 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里.
经过CREATEGLOBALTEMPORARYTABLE来建立一个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该如何展现外部文件中的数据.
建立语句CREATETABLE...ORGANIZATIONEXTERNAL包含了两部分信息:第一部分描述了各个列及其类型,相似于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(只能在建立时插入数据?)
能够进行显示的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通常会按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,则此两例不分配存储空间.
更多推荐
oracle rowed,《Oracle Database Concepts 11g Release 2》读书笔记(2)...
发布评论