oracle 中的數據結構
2024-08-29 13:34:20
供稿:網友
 
                 數據類型(datatype)是列(column)或存儲過程中的一個屬性。    Oracle支持的數據類型可以分為三個基本種類:字符數據類型、數字數據類型以及表示其它數據的數據類型。    字符數據類型                                                                                                CHAR CHAR數據類型存儲固定長度的子符值。一個CHAR數據類型可以包括1到2000個字符。假如對CHAR沒有明確地說明長度,它的默認長度則設置為1.假如對某個CHAR類型變量賦值,其長度小于規定的長度,那么Oracle自動用空格填充。    VARCHAR2存儲可變長度的字符串。雖然也必須指定一個VARCHAR2數據變量的長度,但是這個長度是指對該變量賦值的的最大長度而非實際賦值長度。不需要用空格填充。最多可設置為4000個字符。    因為VARCHAR2數據類型只存儲為該列所賦的字符(不加空格),所以VARCHAR2需要的存儲空間比CHAR數據類型要小。    Oracle推薦使用VARCHAR2    NCHAR和NVARCHAR2 NCHAR和NVARCHAR2數據類型分別存儲固定長度與可變長度的字符數據,但是它們使用的是和數據庫其他類型不同的字符集。在創建數據庫時,需要指定所使用的字符集,以便對數據庫中數據進行編碼。還可以指定一個輔助的字符集[即本地語言集(National Language Set,簡稱NLS)]。NCHAR和NVARCHAR2類型的列使用輔助字符集。    在Oracle9i中,可以以字符而不是字節為單位來表示NCHAR和NVARCHAR2列的長度。    LONG LONG數據類型可以存放2GB的字符數據,它是從早期版本中繼續來的。現在假如想存儲大容量的數據,Oracle推薦使用CLOB和NCLOB數據類型。在表和SQL語句中使用LONG類型有許多限制。    CLOB和NCLOB CLOB和NCLOB數據類型可以存儲多達4GB的字符數據。NCLOB數據類型可存儲NLS數據。    數字數據類型    Oracle使用標準、可變長度的內部格式來存儲數字。這個內部格式精度可以高達38位。    NUMBER數據類型可以有兩個限定符,如:    column NUMBER ( PRecision, scale)    precision表示數字中的有效位。假如沒有指定precision的話,Oracle將使用38作為精度。    scale表示數字小數點右邊的位數,scale默認設置為0.  假如把scale設成負數,Oracle將把該數字取舍到小數點左邊的指定位數。    日期數據類型    Oracle標準日期格式為:DD-MON-YY  HH:MI:SS    通過修改實例的參數NLS_DATE_FORMAT,可以改變實例中插入日期的格式。在一個會話期間,可以通過ALTER session SQL命令來修改日期,或者通過使用SQL語句的TO_DATE表達式中的參數來更新一個特定值。    其它的數據類型    RAW和LONG RAW RAW和LONG RAW數據類型主要用于對數據庫進行解釋。指定這兩種類型時,Oracle以位的形式來存儲數據。RAW數據類型一般用于存儲有特定格式的對象,如位圖。RAW數據類型可占用2KB的空間,而LONG RAW數據類型則可以占用2GB大小。    ROWID ROWID是一種非凡的列類型,稱之為偽列(pseudocolumn)。ROWID偽列在SQL SELECT語句中可以像普通列那樣被訪問。Oracle數據庫中每行都有一個偽列。ROWID表示行的地址,ROWID偽列用ROWID數據類型定義。    ROWID與磁盤驅動的特定位置有關,因此,ROWID是獲得行的最快方法。但是,行的ROWID會隨著卸載和重載數據庫而發生變化,因此建議不要在事務中使用ROWID偽列的值。例如,一旦當前應用已經使用完記錄,就沒有理由保存行的ROWID.不能通過任何SQL語句來設置標準的ROWID偽列的值。    列或變量可以定義成ROWID數據類型,但是Oracle不能保證該列或變量的值是一個有效的ROWID.    LOB    LOB(大型對象)數據類型,可以保存4GB的信息。LOB有以下3種類型:    。CLOB,只能存儲字符數據    。NCLOB,保存本地語言字符集數據
                             。BLOB,以二進制信息保存數據    可以指定將一個LOB數據保存在Oracle數據庫內,還是指向一個包含次數據的外部文件。    LOB可以參與事務。治理LOB中的數據必須通過DBMS_LOB PL/SQL內置軟件包或者OCI接口。    為了便于將LONG數據類型轉換成LOB,Oracle9i包含許多同時支持LOB和LONG的函數,還包括一個ALTER TABLE語句的的新選擇,它答應將LONG數據類型自動轉換成LOB.    BFILE    BFILE數據類型用做指向存儲在Oracle數據庫以外的文件的指針。    xmlType    作為對XML支持的一部分,Oracle9i包含了一個新的數據類型XMLType.定義為XMLType的列將存儲一個在字符LOB列中的XML文檔。有許多內置的功能可以使你從文當中抽取單個節點,還可以在XMLType文檔中對任何節點創建索引。    用戶自定義數據    從Oracle8以后,用戶可以定義自己的復雜數據類型,它們由Oracle基本數據類型組合而成。    AnyType、AnyData和AnyDataSet    Oracle包括3個新的數據類型,用于定義在現有數據類型之外的數據結構。其中每種數據類型必須用程序單元來定義,以便讓Oracle9i知道如何處理這些類型的特定實現。    類型轉換    Oracle會自動將某些數據類型轉換成其他的數據類型,轉換取決于包括該值的SQL語句。    數據轉換還可以通過Oracle的類型轉換函數顯示地進行。    連接與比較    在大多數平臺上Oracle SQL中的連接操作符用兩條豎線()表示。連接是將兩個字符值連接。Oracle的自動類型轉換功能使得兩個數字值也可以進行連接。    NULL    NULL值是關系數據庫的重要特征之一。實際上,NULL不代表任何值,它表示沒有值。假如要創建表的一個列,而這個列必須有值,那么應將它指定為NOT NULL,這表示該列不能包含NULL值。    任何數據類型都可以賦予NULL值。NULL值引入了SQL運算的三態邏輯。假如比較的一方是NULL值,那么會出現3種狀態:TURE、FALSE以及兩者都不是。    因為NULL值不等于0或其他任何值,所以測試某個數據是否為NULL值只能通過關系運算符IS NULL來進行。    NULL值非凡適合以下情況:當一個列還未賦值時。假如選擇不使用NULL值,那么必須對行的所有列都要賦值。這實際上也取消了某列不需要值的可能性,同時對它賦的值也很輕易產生誤解。這種情況則可能誤導終端用戶,并且導致累計操作的錯誤結果。       基本數據結構    表    表是關系數據庫中的一個基本數據結構。表就是行的集合。每行(row)包含一個或多個列。                                                                                                從Oracle8企業版以后,就提供了分區選件,它答應將表和索引進行分區。利用分區,Oracle可從以下兩方面改善性能:    。Oracle不用去訪問那些不滿足查詢條件的分區    。假如分區中所有數據都滿足查詢條件,那么Oracle將選擇全部數據而不需要對每行均進行字句檢查。    視圖    視圖(view)是Oracle中的一種由SQL語句構造的數據結構。SQL語句存儲在數據庫中,在查詢中使用一個視圖時,所存儲的查詢將得以執行,并向用戶返回基表(base table)中的數據。    視圖不包含數據,而是表示一些方法可以查看查詢所指定的基表數據。    視圖有以下幾種用途:    。簡化對多個表數據的訪問    。可以保證表中數據的安全(如,創建包含WHERE子句的視圖就可以限制訪問表中的數據)    。將應用與表中某些特定的結構分離    視圖建立在基表集合的基礎之上,基表包括Oracle數據庫中的事實表或者其他視圖。假如視圖中的任何一個基表進行修改,那么該視圖將無法繼續使用它們,因此視圖本身也無法再使用。
                             索引    索引(index)是用來加快訪問數據庫中記錄速度的一種數據結構。一個索引與一個特定的表相關,而且包含該表的一個或多個列的數據。    創建索引的SQL基本語法:    CREAT INDEX emp_idx1 on emp (ename,job);    其中,emp_idx1時索引名,emp是創建索引的表,ename和job時構成索引的列值。    除了索引數據以外,索引項中還為其相關行保存了ROWID.ROWID是獲取數據庫行的最快方式,因此隨后數據庫行的獲取都是以這種最佳方式來完成。    Oracle中使用的4中類型的索引結構:標準B*-樹索引、反向鍵索引、位圖索引以及Oracle8i引入的基于函數的索引。Oracle使你可以對表中的數據進行聚合,從而改善性能。    其它數據結構    序列(Sequence)    在多用戶數據庫中經常出現的大問題,就是很難為鍵或標識符提供唯一的序號。在這種情況下,Oracle答應創建序列對象。    序列號可以用名字,一個遞增值或有關序列的其他一些信息。序列獨立于任何表,因此多個表可以使用同樣的序列號。    同義詞(Synonym)    所有的Oracle數據庫的數據結構都存儲在一個特定的模式(schema)。模式是和一個特定的用戶名相關聯的,所有對象都通過帶有對象名的模式名得到引用。    例如,模式DEMO中有一個表名為EMP.假如想引用表EMP,那么應該通過完整名DEMO.EMP來引用。假如沒有提供特定的模式名,那么Oracle假定該結構處于當前用戶名的模式中。    集群(Cluster)    集群是一種能夠改善獲取性能的數據結構。集群和索引一樣,不會影響表的邏輯視圖。    散列集群(Hash Cluster)    數據設計    約束    約束(constraint)強制數據庫中某些數據的完整性。當給某列增加一個約束,Oracle自動確保不滿足此約束的數據是絕不能被接受的。    約束可以在創建或增加包括某列(通過要害字)的表時與列相關聯,或者在表創建后通過SQL命令ALTER TABLE來實現與該列的關聯。在Oracle8及以后的版本中支持以下5個約束類型:    NOT NULL    對于任何列都可以設為NOT NULL.假如在任何SQL操作中將一個NULL值賦給某個有NOT NULL約束的列,Oracle會為這個語句返回一個錯誤。    惟一性    主鍵    外鍵    校驗    某些約束需要創建所以來支持。    約束可以是立即的或延遲的。立即約束(immediate constraint)只要有寫操作就會立即對受約束列產生影響;而延遲約束(deferred constraint)只有在對約束行產生變化的SQL語句執行完時才有強制作用。    對于某個特定表的約束可設置成暫時掛起。當再次啟動該約束操作時,再要求Oracle對該約束驗證所有數據,或者只是對新數據應用約束。在現有表中增加約束時,可以指定是否對表中所有記錄進行約束校驗。    觸發器    觸發器是個代碼塊,當某個表中發生了某種類型的數據庫事件時它就會被觸發,有以下3種事件會導致觸發器的觸發:    。數據庫UPDATE    。數據庫INSERT    。數據庫DELETE    例如,可以定義一個觸發器,從而在用戶改變某一行時,寫一個定制的審查記錄。    觸發器是在行一級被定義的。可以指定觸發器是對每一行觸發,或者對觸發該觸發器事件的SQL語句觸發。    觸發器的觸發有3個時機:
。在執行觸發事件之前                          
。在執行觸發事件之后
。非觸發事件    將前兩種時間選項與觸發器所觸發的行和語句的結合,則有4種可能的觸發器實現:在語句之前;在行之前;在語句之后;在行之后。    任何觸發器都可以有一個觸發器限制(trigger restriction)。觸發器限制是一個布爾表達式,假如其值為FALSE,那么就阻止觸發器觸發。    觸發器的定義和存儲都獨立于使用它們的表。因為觸發器包含邏輯,所以必須通過比SQL功能強的某種實現數據訪問的語言來寫。可以直接用PL/SQL或java來寫觸發器,也可以通過調用其中任一種語言編寫的現有存儲過程來寫觸發器。    觸發器觸發是SQL語句執行的結果,該SQL語句修改了某個表中的行。觸發觸發器的操作可能是修改這個表中的數據,或者產生某些改變來觸發其他表的觸發器。這么做的最后結果可能是以某種方法修改了數據,但Oracle認為這是不合邏輯的。這些情況都會導致Oracle返回變異表(mutating table,被其他觸發器修改的表)的運行時錯誤,或是返回約束表(constraining table,被其他約束修改的表)的運行時錯誤。
                             Oracle8i還引入了一組非常有用的系統事件觸發器和用戶事件觸發器。現在可以在系統事件(如,數據庫啟動或關閉)中放置觸發器,也可以在用戶事件(登錄和退出)中放置觸發器。       查詢優化                                                                                                不用事先定義訪問數據的路徑是關系數據庫的一大優點。向Oracle數據庫提交一個SQL查詢時,Oracle必須確定如何訪問數據。因為Oracle要找到一種最佳的方式來檢索數據,所以進行決策的過程稱為查詢優化(query optimization)。這種檢索稱為執行路徑(execution path)。查詢優化的技巧就是在眾多可用的方式中選擇一種最有效的方式來獲得數據。    例如,即使對于只涉及一個表的查詢,Oracle也會采用下列方法之一:    。使用索引來查找所請求的行的ROWID,然后從表中檢索這些行。    。對表進行掃描并檢索行,稱為完全表掃描(full table scan)    雖然在通常情況下,使用索引來檢索數據要快得多,但在索引獲取值的過程中涉及到一個附加的I/O步驟來處理查詢。利用索引值來選擇滿足要求的行所需的I/O操作較少,比從表中獲取數據然后對數據執行選擇條件的效率高得多。    確定優化查詢執行計劃的另一個因數在于查詢中是否包含ORDER BY條件,從而使之能夠按預排序索引自動實現。相反的,假如表很小,優化器可能選擇讀數據庫中所有的記錄,而不是索引。    有兩種Oracle查詢優化器可供選擇:基于規則的優化器和基于開銷的優化器    基于規則的優化器    使用預先定義的規則集作為查詢優化的主要決策依據。    它的一個缺點是過分簡單化的規則集。該優化器有大約二十條規則,每個規則的權值相同。對于復雜的數據庫,基于規則的優化器的簡單規則無法做出最佳的選擇。    基于規則的優化器對每個可能的路徑都賦予一個優化成績,然后根據最好的優化成績來挑選最佳路徑。基于規則的優化器另一個缺點是不能確定優化成績相同時的執行路徑,只能依靠SQL語句的語法來解決問題,被選擇的執行路徑往往由SQL語句中個表出現的先后順序來決定。    基于開銷的優化    為了改進SQL語句的優化性能,Oracle在Oracle7中引入了基于開銷的優化器。基于開銷的優化器比基于規則的優化器要復雜一些,它通過邏輯I/O操作數最小的原則來選擇查詢路徑。    Oracle8及以后的版本默認優化器為基于開銷的優化器。為了正確衡量所有執行計劃的開銷,基于開銷的優化器對有關數據結構的組成進行統計。    統計    基于開銷的優化器通過使用自己內部的統計相關的規則和邏輯來反映數據庫中數據結構的狀態。這些統計與執行計劃中的表、列以及索引相關。    這些統計類型存放在數據字典的三個表中    這些統計類型可以單獨或組合或二者結合使用,從而確定一個執行計劃需要的所有I/O開銷。這些統計類型可以反映出表的大小和數據塊中沒有被使用的空間總量兩方面信息;相應的,這些空間反映出檢索行所需要的I/O操作次數。索引統計反映索引樹的深度與廣度,而且反映樹中值的唯一性,使用該索引可以簡化數據的選擇。    Oracle及以后的版本通過SQL語句ANALYZE來搜集這些統計信息。在一個SQL語句中可以對表、索引或集群進行分析。收集統計信息是耗費資源的工作,在某些方面,有點像創建索引。因為本身隱含的效果,ANALYZE命令有下面兩個選項:    COMPUTE STATSTICS    在整個數據結構中計算統計數據    ESTIMATE STATISTICS    指定行數或數據結構中的一個百分比來進行統計分析。    對于收集相關統計信息,后一種選項比進行整個數據結構的計算所耗費的資源要少得多。    注重:基于開銷的優化器的精度取決于它所使用的統計的精度,因此應該將統計信息的更新作為維護計劃的一個標準部分。    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1450779