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 進行加減運算.
格式化時, 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 裏.
經過 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(只能在建立時插入數據?)
能夠進行顯示的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, 則此兩例不分配存儲空間.