每個Oracle資料庫都是資料的集合,這些資料包含在一個或多個檔案中。資料庫有物理和邏輯兩種結構。在開發應用程式的過程中,會建立諸如表和索引這樣的結構,這些結構用於資料行的儲存和查詢。可以為物件的名稱建立同義詞(synonym),通過資料庫連結在不同的資料庫中檢視物件,並能夠限制物件的訪問許可權。甚至可以使用外部表訪問資料庫之外的檔案中的資料行,其效果就像訪問表中的資料行一樣。
Oracle例項(instance)由命名為系統安全域性(System Global Area,SGA)的記憶體區域和相應的後臺程式組成,這些後臺程式負責SGA和資料庫磁碟檔案之間的互動。在Oracle實時應用叢集(Oracle Real Application Cluster,RAC)中,會有多個例項同時使用同一個資料庫。這些例項通常位於不同的伺服器上,這些伺服器保持高速內部互聯(interconnect)。
資料庫技術
在Oracle資料庫中,基本的結構是表。Oracle Database 支援多種型別的表:
- 關係表(relational table) 使用Oracle提供的資料型別,可以建立儲存行資料的表,這些行是由應用程式插入和操作的。表中包含列定義,可以根據應用程式的需求變化新增或刪除。建立表時使用create table命令。
- 物件關係表(object-relational table)為了充分利用諸如型別繼承等功能,可以使用Oracle的物件關係功能。可以定義自己的資料型別,並在列定義、物件表、巢狀表、可變陣列等其它的地方使用這些資料型別。
- 索引組織表(index-organized table)可以建立一個表,這個表把資料儲存在一個索引結構中,是的表中的資料根據索引的值排列。
- 外部表(external table)可以把儲存在平面檔案中的資料看做表,使用者可以對其直接進行查詢,並在查詢中把它和其他表關聯起來。可以使用外部表,在不需要把大量資料匯入到資料庫中的情況下就可以對這些資料進行訪問。Oracle還支援BFILE資料型別,它是一個指向外部二進位制檔案的指標。在建立一個BFILE或外部表之前,必須在Oracle中(通過create direction命令)建立一個目錄別名,使這個目錄指向外部檔案的物理位置。
- 分割槽表(partitioned table)可以把一個表分成多個部分,並單獨管理表的每一部分。可以向表中新增新的分割槽、拆分已經存在的分割槽並在獨立於請他分割槽的情況下管理某個分割槽。對錶進行分割槽能夠簡化維護操作,或能夠提高使用者查詢效率。可以按照一定的資料範圍、資料列表、列資料的雜湊值或者這幾個條件的某種組合來對錶進行分割槽。
- 物化檢視(materialized view) 物化檢視是由查詢檢索到資料的副本。使用者查詢可能會被重定向到物化檢視,以避免在查詢執行期間訪問大型表------Oracle優化程式會自動重寫查詢。
- 臨時表(temporary table)可以使用create global temporary table 命令建立一個表,該表允許多個使用者在其中插入資料。每個使用者只能看到他自己在表中插入的資料。
- 叢集表(clustered table)如果兩個表經常被一起查詢,那麼可以通過叢集(cluster)結構把他們儲存到物理相鄰的位置。
- 刪除的表(dropped table)可以通過flashback table to before drop 命令迅速恢復已刪除的表,可以一次把多個表和整個資料庫恢復到某個時間點之前的狀態。Oracle支援閃回查詢(flashback query),這種查詢將返回表以前某個版本中的資料。
為了訪問表,可以使用檢視。檢視能夠處理連結(join)和聚集(aggregation)、限制返回的資料行數或更改顯示的列。檢視可以是隻讀的,也可以是可更新的,而且他們可以引用本地表或遠端表。遠端表可以通過資料庫連結來訪問。可以用同義詞隱藏表的物理位置。
為了調整對錶的訪問,Oracle支援很多型別的索引:
- B*樹索引(B*tree index)B*樹索引是Oracle標準索引型別,它對於選擇符合某個等式條件或範圍條件的資料非常有用。這種索引由create index命令建立。
- 點陣圖索引(bitmap index)對於只有極少幾個值的列,點陣圖索引也許能提高查詢效能。點陣圖索引只應該在資料被批量載入時使用。
- 反鍵使用(reverse key index)如果在連續插入資料時牽涉I/O操作,Oracle會在儲存資料之前動態地反轉已經按索引排序好的資料。
- 基於函式的索引(function-based index)除了以一列作為索引,還可以把基於函式的列作為索引,如UPPER(name)。這種基於函式的索引可以為Oracle優化器在選擇執行路徑時提供更多的選擇。
- 分割槽索引(partitioned index)可以對索引分割槽,以支援分割槽表或者簡化索引管理,索引分割槽可以只作用於表分割槽,也可以作用於表中所有的行。
- 文字索引(text index)可用文字資料為索引,以支援高階的搜尋功能,如擴充套件單詞詞幹或搜尋短語。文字索引是由Oracle維護的一系列表和索引值,這些表和索引值能夠滿足複雜的文字搜尋需要。
儲存資料
所有這些邏輯結構都必須儲存在資料庫中的某個地方。Oracle維護一個資料字典,這個字典中記錄了與所有物件有關的後設資料,對於需要自己的物理空間裡儲存物件,Oracle會在一個表空間(tablespace)中為其分配空間。
1、表空間
表空由一個或多個資料檔案組成;資料檔案是表空間的一部分,而且也只能是一個表空間的一部分。Oracle Database至少為每個資料庫建立兩個表空間:SYSTEM 和SYSAUX以支援其內部管理的需要。可以使用Oracle託管檔案(OMF,Oracle Managed File)和自動儲存管理(Automatic Storage Management,ASM)簡化資料檔案的建立和維護。
可以建立一種特殊的表空間,稱為bigfile表空間,其大小可達幾千個TB。藉助於OMF,對bigfile的管理使得對錶空間的登入對DBA完全透明;DBA可以把表空間作為一個整體來管理,而不用擔心空間的大小和底層資料檔案的各種結構。
如果一個表空間被指定為臨時表空間,則這個表空間本身是永久性的,但是儲存在它裡面的資料是臨時的。Oracle使用臨時表空間來支援諸如建立索引和連線處理這樣的排序操作,臨時資料段和永久物件不應該儲存在相同的表空間中。
Oracle使用者和許可權
Oracle中,一般不會輕易在一個伺服器上建立多個資料庫,在一個資料庫中,不同的專案由不同的使用者訪問,每一個使用者擁有自身建立的資料庫物件,因此使用者的概念在Oracle中非常重要。Oracle的使用者可以用create user命令了建立:
create user 使用者名稱 identified by 口令了 [account lock|unlock]
lock|unlock 建立使用者時是否鎖定,預設為鎖定狀態。鎖定的使用者無法正常的登入進行資料庫操作。儘管使用者建立成功,但是還不能正常的登入Oracle資料庫,因為該使用者還沒有任何許可權。如果使用者能夠正常登入,至少需要create session系統許可權。
Oracle使用者對資料庫管理或物件操作的權利,分為系統許可權和資料庫物件許可權。系統許可權比如:create session,create table 等,擁有系統許可權的使用者,允許擁有相應的系統操作。資料庫物件許可權,比如對錶中的資料進行增刪改操作等,擁有資料庫物件許可權的使用者可以對所擁有的物件進行相應的操作。
還有一個概念就是資料庫角色(role),資料庫角色就是若干個系統許可權的集合。
- connect 角色,主要應用在臨時使用者,特別是那些不需要建表的 使用者,通常只賦予connect 角色。connect是使用Oracle的簡單許可權,擁有connect角色的使用者,可以與伺服器建立會話(session,客戶端與伺服器連線,稱為會話)。
- resource角色,更可靠和正式的資料庫使用者可以授予resource角色。resource提供給使用者另外的許可權以建立它們自己的表、序列、過程(procedure)、觸發器(trigger)、索引(index)等。
- DBA角色,擁有所有的系統許可權-----包括無限制的空間限額和給其它使用者授予各種許可權的能力。使用者SYSTEM擁有DBA角色。
一般情況下,一個普通使用者,擁有connect和resource兩個角色即可進行常規的資料庫開發工作。可以把某個許可權授予某個角色,可以把許可權、角色授予某個使用者。系統許可權只能由DBA使用者授予,物件許可權由擁有該物件的使用者授權:grant 角色|許可權 to 使用者(角色)
回收許可權:revoke 角色|許可權 from 使用者(角色)
修改使用者密碼: alter user 使用者名稱 identified by 新密碼
修改使用者鎖定(非鎖定)狀態: alter user 使用者名稱 account lock|unlock
SQL簡介
SQL是結構化查詢語言(Structured Query Language),專門用於三角存取、資料更新及資料庫管理等操作。
在Oracle開發中,客戶端把SQL語句傳送給伺服器,伺服器對SQL語句進行編譯、執行,把執行的結果返回給客戶端。Oracle SQL語句:
- 資料定義語言(DDL),包括create(建立)命令、alter(修改)命令、drop(刪除)命令等
- 資料操作語言(DML),包括insert(插入)命令,update(更新)命令、delete(刪除)命令、select...from(查詢)等
- 資料查詢語言(DQL),包括基本查詢語句、Order by 子句、Group by子句等
- 事物控制語言(TCL),包括commit(提交)命令、savepoint(儲存點)命令、rollback(回滾)命令。
- 資料控制語言(DCL),grant(授權)命令、revoke(撤銷)命令。
目前主流的資料庫產品都支援標準的SQL語句。資料定義語言,表的增刪改操作、資料簡單查詢、事物的提交和回滾,許可權的授予和撤銷等。
Oracle資料型別
Oracle資料庫的核心是表,表中使用到的常用資料型別:
型別 | 含義 |
char(length) | 儲存固定長度的字串。引數length指定長度,如果儲存的字串長度小於length,用空格填充。預設長度是1,最長不超過2000位元組 |
varchar2(length) | 儲存可變長度的字串。length指定了該字串的最大長度。預設長度是1 ,最長不超過4000字元。 |
number(p,s) | 既可以儲存浮點數,也可以儲存整數,p表示數字的最大位數(如果是小數包括整數部分和小數部分,p預設是11位),s是指小數位數 |
DATE() | 儲存日期和時間,儲存紀元、4位年、月、日、時、分、秒,儲存時間從公元前4712年1月1日到公元后4712年12月31日 |
TIMESTAMP | 不但儲存日期的年月日,時分秒,以及秒後6位,同時包含時區 |
CLOB | 儲存大的文字,比如儲存非結構化的XML文件 |
BLOB | 儲存二進位制物件,如圖形、視訊、聲音等 |
對於日期型別,可以使用sysdate內建函式可以獲取當前的系統日期和時間,返回DATE型別,用systimestamp函式可以返回當前日期、時間和時區。
建立表和約束
Oracle建立表同SQL Server一樣,使用create table 命令來完成。建立約束則使用如下命令: alter table 表名 add constraint 約束名 約束內容 ;
不論建立表還是約束,與SQL Server基本相同,注意:在Oracle中default 是一個值,而SQL Server 中default 是一個約束,因此Oracle的default設定可以在建表的時候建立。