1.表數據的存儲及格式
一個Oracle數據塊(Data block)通常存儲著一條記錄的一個片段(Row piece),假如一條記錄以多個記錄片段的方式保存,那么這些記錄片段之間會被互相"鏈接"。
當一個表擁有的列數目超過255個,那么每條記錄的第255個字段之后的數據,會被存放到另外的記錄片段中,以Rowid相連。這被稱為(Intra-block chaining)。
因為同一條記錄,不管被分成多少個row piece存儲,每一個piece的rowid都是相同的。通過這一點就可以把數據“鏈接”起來。
每一個記錄片段,不管是鏈接的還是非鏈接的,都包含了一個記錄頭(Row header)

2. Rowid
rowid會一直伴隨Oracle記錄,直到記錄被刪除。假如記錄被export,然后import那么rowid也會改變。
3. 表壓縮
Duplicate values in all the rows and columns in a block are stored once at the beginning of the block, in what is called a symbol table for that block. All occurrences of such values are replaced with a short reference to the symbol table.
Oracle通過剔除重復的字段值,并替換為對唯一值的引用,來壓縮表空間。表壓縮可以在表空間級別,表級別,表分區(qū)級別指定。多個壓縮策略可以作用于同一個表
4. 表空值
Nulls are stored in the database if they fall between columns with data values. In these cases they require 1 byte to store the length of the column (zero) Nulls are not indexed, except when the cluster key column value is null or the index is a bitmap index.
5. 分區(qū)表
分區(qū)表允許用戶將一個大的表劃分成多個小的,可獨立管理的片段--稱為分區(qū)表,甚至分區(qū)還可以再劃分分區(qū),分區(qū)表的好處是每個分區(qū)能夠被分別的管理,而且在一個分區(qū)上進行的操作對其它分區(qū)沒有產生影響
6. 臨時表
臨時表中的數據是會話私有的(這一點類似于Java中ThreadLocal類),數據僅對創(chuàng)建它的會話可見。臨時表可以被多個不同事務或會話同時訪問,但是每個會話或事務只能看到臨時表中屬于自己的那份私有數據。
在使用trunc命令清空數據時,只會清除屬于自己的那部分臨時數據,而不清空其它會話在臨時表中的數據。
請注意:由于臨時表的數據在事務結束或會話結束后就被自動丟棄,所以數據的最終變化過程并不會記錄到redo日志文件。但是對于臨時表在計算過程中產生的數據,同樣會有undo log和對應的redo log產生。也就是說redo log是針對DML操作而產生的,而不是針對表的變化而產生的。
Oracle的實用套件可以export/import臨時表的定義(實際上臨時表本身并不會自動刪除,和持久表一樣它的定義一樣也是保存在shcema下的),但是臨時表中的數據不能被導出,即便用戶使用了rows=Y這樣的選項。
不同于普通類型的表在定義時就被創(chuàng)建,為了節(jié)省空間臨時表只在第一條Insert語句執(zhí)行時才創(chuàng)建。這也就是說:由于臨時表是再第一次insert語句被執(zhí)行時再創(chuàng)建,所以假如有一個臨時表被創(chuàng)建后,另外一個連接在沒有insert數據之前執(zhí)行select,將不會看到任何數據。因為其他session插入的數據對它來說是不可見的。但是沒有執(zhí)行insert就select,update,delete則肯定會報錯。
當一個會話向臨時表發(fā)出了Insert請求時,就和臨時表進行了綁定。當會話向臨時表發(fā)出Trancate命令,或者事務被提交、回滾后會話和臨時表之間的綁定關系就被解除。
請注意下面幾點:
①在同一個會話中,不同的事務不能同時并發(fā)地使用同一個基于事務的臨時表
②來自不同會話的事務則可以并發(fā)的訪問同一個基于事務的臨時表。
③假如事務中已經執(zhí)行了Insert操作,此時假如事務尚未結束則事務的子事務不能再執(zhí)行Insert操作(因為父事務尚未結束,不允許并發(fā)訪問)
④假如事務的子事務執(zhí)行了Insert操作,那么當子事務結束后其插入的數據將自動被刪除。父事務或其它子事務可以執(zhí)行Insert操作(因為子事務已經結束)
這是因為:因為臨時表上面是沒有DML鎖的,所以同一個會話中的不同transaction如果并行訪問臨時表的話會引起數據混亂。但是不同的session中不同的事務并行訪問同一個臨時表是可以的,因為此時數據都是彼此不可見的。
7. 外部表
外部表(External table)可以訪問數據庫外的資源,就像訪問數據庫內部的表資源一樣。外部表本身并不包含數據,它只包含兩部分的定義:
1.表的列定義
2.表的列定和外部資源的轉換映射規(guī)則
至于數據如何存儲和讀取則由驅動程序負責。由于外部表本身不存儲數據而是從其它資源處讀取數據,所以外部表是只讀的,不能執(zhí)行任何DML操作和索引創(chuàng)建操作。
外部表的Loading/unloading操作分別指從外部表中加載數據到數據庫的表,以及從數據庫中的表讀取數據然后插入到外部表中。由于外部表和外部資源文件之間松散的聯系,所以外部資源文件可以包含或不包含出現在外部表中的字段,數據類型也可能不一致。至于兩者之間如何進行轉換則靠外部的驅動程序完成。
那么外部表的用途在那里呢:當我們業(yè)務計算過程中需要臨時讀取一批大量數據(比如說日志記錄),而這批數據又不是存儲在自己的數據庫(通常是遠程數據庫),而且數據不是以表的方式存儲(通常是CSV文件),那么我們就需要從外部資源中來讀入數據了。由于外部表并不存儲數據,所以我們完全不怕大量的臨時數據占據了寶貴的磁盤空間。
由于external table本身并不存儲實際數據,而是依賴于外部資源。所以一旦數據被加載到external table后,如果需要更新。必須先unload后再load
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2009-03-02 16:47
Paul Lin 閱讀(1345)
評論(0) 編輯 收藏 所屬分類:
Oracle Concept