《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, 則此兩例不分配存儲空間.

相關文章
相關標籤/搜索