體系結(jié)構(gòu):
數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)是指數(shù)據(jù)庫(kù)的組成、工作過程與原理,以及數(shù)據(jù)在數(shù)據(jù)庫(kù)中的組織與管理機(jī)制。
體系結(jié)構(gòu)包括:實(shí)例(instence),數(shù)據(jù)庫(kù)文件(database),用戶進(jìn)程(user process
,服務(wù)器進(jìn)程(server process),以及其他文件(如參數(shù)文件(parameter file),密碼文件(password file),歸檔日志文件(archive log file)等)。
Oracle服務(wù)器由數(shù)據(jù)庫(kù)文件和數(shù)據(jù)庫(kù)實(shí)例組成。
其中數(shù)據(jù)庫(kù)實(shí)例包括SGA(即內(nèi)存結(jié)構(gòu)的集合)和管理數(shù)據(jù)庫(kù)的后臺(tái)進(jìn)程。
數(shù)據(jù)庫(kù)文件包括三種:數(shù)據(jù)文件(data files),控制文件(control files)和重做日志文件(redo log files)。
Oracle中的個(gè)主要內(nèi)存區(qū)域是:
– 系統(tǒng)全局區(qū)域(system global areaSGA)--當(dāng)數(shù)據(jù)庫(kù)實(shí)例啟動(dòng)時(shí)會(huì)首先分配
– 程序全局區(qū)域(program global areaPGA
– 用戶全局區(qū)域(user global areaUGA
SGA內(nèi)存結(jié)構(gòu)包括: 共享池(Shared Pool),數(shù)據(jù)緩沖區(qū)(Database Buffer Cache),重做日志緩沖區(qū)(Redo Log Buffer Cache)。共享池的作用:共享池由庫(kù)緩存和數(shù)據(jù)字典緩存組成。緩存和共享SQLPL/SQL代碼;數(shù)據(jù)緩沖區(qū)的作用:存儲(chǔ)從數(shù)據(jù)文件中讀入的數(shù)據(jù),提高查詢速度;重做日志緩沖區(qū)的作用:變化前和變化后的數(shù)據(jù)在寫入數(shù)據(jù)緩沖區(qū)前都會(huì)先寫入重做日志緩沖區(qū),這樣在數(shù)據(jù)恢復(fù)時(shí),Oracle就知道哪些需要回滾。日志數(shù)據(jù)首先產(chǎn)生于重做日志緩沖區(qū),當(dāng)重做日志緩沖區(qū)的日志數(shù)據(jù)達(dá)到一定數(shù)量時(shí),由日志寫進(jìn)程LGWR將日志數(shù)據(jù)寫入重做日志文件中。
PGA是為單獨(dú)的服務(wù)器進(jìn)程存儲(chǔ)私有數(shù)據(jù)的內(nèi)存區(qū)域,只為各個(gè)服務(wù)器進(jìn)程提供一個(gè)PGAPGA只能由他們的服務(wù)器進(jìn)程訪問。
UGA是用于存儲(chǔ)會(huì)話狀態(tài)的內(nèi)存區(qū)域。UGA的位置依賴于服務(wù)器是運(yùn)行在共享服務(wù)器模式中,還是專用服務(wù)器模式中。在專用服務(wù)器模式中,UGA會(huì)在PGA中分配,只能夠由服務(wù)器進(jìn)程訪問。
Oracle進(jìn)程主要有用戶進(jìn)程、服務(wù)器進(jìn)程和后臺(tái)進(jìn)程。
用戶進(jìn)程是一個(gè)需要與Oracle服務(wù)器進(jìn)行交互的程序。
服務(wù)器進(jìn)程猶如一個(gè)中介,完成用戶的各種數(shù)據(jù)服務(wù)請(qǐng)求,而把數(shù)據(jù)庫(kù)服務(wù)器返回的數(shù)據(jù)發(fā)給客戶端。
后臺(tái)進(jìn)程主要作用是協(xié)調(diào)好系統(tǒng)的性能。其主要包括進(jìn)程監(jiān)控進(jìn)程(PMON,服務(wù)器進(jìn)程的管理和維護(hù))、系統(tǒng)監(jiān)控進(jìn)程(SMON,在數(shù)據(jù)庫(kù)出現(xiàn)故障時(shí)進(jìn)行實(shí)例恢復(fù))、數(shù)據(jù)庫(kù)寫進(jìn)程(DBWR,主要負(fù)責(zé)將數(shù)據(jù)緩沖區(qū)內(nèi)的數(shù)據(jù)寫到數(shù)據(jù)文件)、重做日志寫進(jìn)程(LGWR,主要負(fù)責(zé)將重做日志緩沖區(qū)內(nèi)的數(shù)據(jù)寫到重做日志文件)及檢查點(diǎn)進(jìn)程(CKPT,其作用是保證所有修改過的數(shù)據(jù)庫(kù)緩沖區(qū)都被寫入數(shù)據(jù)庫(kù)文件)。以上5個(gè)進(jìn)程也是數(shù)據(jù)庫(kù)啟動(dòng)過程中必須啟動(dòng)的。
數(shù)據(jù)庫(kù)啟動(dòng)和關(guān)閉
數(shù)據(jù)庫(kù)的啟動(dòng)3個(gè)狀態(tài):
1:NOMOUNT 只打開數(shù)據(jù)庫(kù)實(shí)例
2:MOUNT 打開實(shí)例并讀取控制文件
3:OPEN 打開數(shù)據(jù)庫(kù)
按123順序啟動(dòng)
數(shù)據(jù)庫(kù)的關(guān)閉3個(gè)狀態(tài):
1:CLOSE 關(guān)閉數(shù)據(jù)庫(kù)
2:DISMOUNT
3:SHUTDOWN 關(guān)閉數(shù)據(jù)庫(kù)實(shí)例
事務(wù)
事務(wù)的概念:事務(wù)是一組邏輯工作單元,它由一條或多條SQL語(yǔ)句組成。
事務(wù)的4個(gè)特性:原子性,一致性,隔離性和持久性
事務(wù)控制:commit,rollback
SQL語(yǔ)言
SQL語(yǔ)言分為數(shù)據(jù)定義語(yǔ)言(DDL)、數(shù)據(jù)操縱語(yǔ)言(DML)和數(shù)據(jù)控制語(yǔ)言(DCL)。
DDL用于定義SQL模式、基本表、視圖和索引的創(chuàng)建和撤消操作。常用命令有:CREATE、ALTER、DROP。
DML用于數(shù)據(jù)的插入、修改、刪除和查詢。常用命令有:INSERT、UPDATE、DELETE、SELECT。
DCL用于對(duì)基本表的授權(quán)、完整性規(guī)則的描述和事務(wù)的控制等。常用的命令有:GRANT、REVOKE、COMMIT、SAVEPOINT、ROLLBACK。
har和varchar2兩種數(shù)據(jù)類型的區(qū)別:
在數(shù)據(jù)庫(kù)中char(n)表示固定長(zhǎng)度n的字符串,當(dāng)實(shí)際數(shù)據(jù)不足定義長(zhǎng)度時(shí),將使用空格補(bǔ)全右邊不足位,當(dāng)實(shí)際數(shù)據(jù)的長(zhǎng)度大于其固定長(zhǎng)度時(shí),Oracle將不允許數(shù)據(jù)存儲(chǔ)于對(duì)應(yīng)列或者變量中,并拋出異常;
而varchar2(n)是可變長(zhǎng)的字符串,意味著該列或變量的最大長(zhǎng)度不大于n,但當(dāng)實(shí)際數(shù)據(jù)小于n時(shí),并不在其右端補(bǔ)齊空格。
delete和truncate的區(qū)別。
elete是DML語(yǔ)句,在刪除數(shù)據(jù)時(shí)要記錄重做信息,且刪除數(shù)據(jù)后不釋放表空間,速度慢。runcate是數(shù)據(jù)定義語(yǔ)言,執(zhí)行后數(shù)據(jù)直接刪除且釋放表空間,不記錄日志信息,速度快。
PL/SQL語(yǔ)言
PL/SQL語(yǔ)言的敘述:
PL/SQL是一種塊結(jié)構(gòu)的語(yǔ)言,它將一組語(yǔ)句放在一個(gè)塊中。構(gòu)成PL/SQL程序的基本單元是邏輯塊(如過程、函數(shù)或匿名塊),每個(gè)邏輯塊對(duì)應(yīng)要解決的問題或子問題。PL/SQL塊共分為3個(gè)部分,分別為聲明部分、可執(zhí)行部分和異常處理部分。
屬性數(shù)據(jù)類型包括兩種,分別是%TYPE和%ROWTYPE。
1、%TYPE將某種數(shù)據(jù)類型的變量或列提供給其他變量。
其語(yǔ)法格式為:var1 table_name.column_name%TYPE;其中聲明了變量var1,它的數(shù)據(jù)類型與table_name表中的column_name字段的數(shù)據(jù)類型相同。
2、%ROWTYPE提供一種表示表中的某行的記錄類型。
其語(yǔ)法格式為:var1 table_name%ROWTYPE;其中聲明了變量var1,可以用來(lái)存儲(chǔ)從table_name表中提取的一個(gè)記錄。
過程、函數(shù)、程序包
過程和函數(shù)的區(qū)別:過程沒返回值,而函數(shù)有返回值。
程序包是對(duì)相關(guān)過程、函數(shù)、變量、游標(biāo)和異常等對(duì)象的封裝。
程序包由規(guī)范和主體兩部分組成。規(guī)范可以在沒有程序包主體的情況下存在,主體不能在沒有程序包規(guī)格說(shuō)明的情況下存在。
游標(biāo)和觸發(fā)器
游標(biāo)的4種屬性:%sopen 、%found、%notfound、%rowcount。
使用游標(biāo)的個(gè)步驟:定義游標(biāo)(declare)、打開游標(biāo)(open)、循環(huán)取數(shù)據(jù)(fetch)、關(guān)閉游標(biāo)(close)。
顯式游標(biāo)和隱式游標(biāo)在使用過程中的區(qū)別:顯示游標(biāo)使用時(shí)要定義、隱式游標(biāo)不需要定義,在上下文中的dml語(yǔ)句默認(rèn)使用隱式游標(biāo)。
觸發(fā)器定義:觸發(fā)器是當(dāng)特定事件出現(xiàn)時(shí)自動(dòng)執(zhí)行的代碼塊。
觸發(fā)器與過程的區(qū)別:過程是由用戶或應(yīng)用程序甚至是觸發(fā)器顯式調(diào)用的,而觸發(fā)器是由Oracle根據(jù)發(fā)生的事件而隱式激活的,它不能被直接調(diào)用執(zhí)行。
觸發(fā)器的類型及其運(yùn)行時(shí)機(jī):
Oracle觸發(fā)器分為DML觸發(fā)器、模式(DDL或用戶事件)觸發(fā)器和數(shù)據(jù)庫(kù)級(jí)觸發(fā)器。
1:DML觸發(fā)器:當(dāng)DML語(yǔ)句在表中發(fā)生時(shí)執(zhí)行。DML語(yǔ)句包括以下3種類型:
a.語(yǔ)句級(jí)觸發(fā)器:無(wú)論受觸發(fā)語(yǔ)句影響的行數(shù)是多少,都只激活一次。
b.行級(jí)觸發(fā)器:每當(dāng)觸發(fā)器語(yǔ)句影響表時(shí)就會(huì)激活行級(jí)觸發(fā)器,行級(jí)觸發(fā)器在被修改的每一行上執(zhí)行一次。
c.INSTEAD OF觸發(fā)器:允許用戶修改不能使用DML語(yǔ)句修改的視圖。INSTEAD OF觸發(fā)器只可用于視圖,不可用于表。
2:模式(DDL或用戶事件)觸發(fā)器:在數(shù)據(jù)庫(kù)模式中執(zhí)行DDL語(yǔ)句時(shí)激活。
3:數(shù)據(jù)庫(kù)(系統(tǒng)事件)觸發(fā)器:在發(fā)生LOGOFF(退出)、LOGON(登錄)、STARTUP(打開)、SHUTDOWN(關(guān)閉)數(shù)據(jù)庫(kù)和SERVERERROR(生成錯(cuò)誤消息)等系統(tǒng)事件時(shí)執(zhí)行。
數(shù)據(jù)庫(kù)對(duì)象(同義詞,序列,視圖,索引)
同義詞的定義:是現(xiàn)有對(duì)象的一個(gè)別名。
同義詞的作用:
1:簡(jiǎn)化SQL語(yǔ)句。:隱藏對(duì)象的名稱和所有者。:提供對(duì)對(duì)象的公共訪問。
同義詞的兩種類型:
1:公有同義詞。CREATE public synonym emp_syn FOR SCOTT.emp;
2:私有同義詞。CREATE synonym emp FOR SCOTT.emp;
公有的同義詞只能建立在超級(jí)用戶下定義。
序列是用來(lái)生成唯一、連續(xù)的整數(shù)的數(shù)據(jù)庫(kù)對(duì)象。
在表中使用序列:
1.創(chuàng)建序列:
CREATE SEQUENCE sequence_name [START WITH startnum [INCREMENT BY step];
2.創(chuàng)建表時(shí)使用序列:
CREATE TABLE table_name uid smallint not null, ...);
3.插入數(shù)據(jù)時(shí)使用序列:
INSERT INTO table_name VALUES(sequence_name.NEXTVAL, ...);
視圖是從若干基本表和(或)其他視圖構(gòu)造出來(lái)的表。
視圖和表的區(qū)別是:創(chuàng)建一個(gè)視圖時(shí),只是把其視圖的定義存放在數(shù)據(jù)字典中,而不存儲(chǔ)視圖對(duì)應(yīng)的數(shù)據(jù),而表會(huì)存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù)。
視圖的目的和作用:篩選表中數(shù)據(jù),簡(jiǎn)化查詢語(yǔ)句,對(duì)表起到保護(hù)作用。
注:加WITH READ ONLY 選項(xiàng)可使視圖不允許DML操作
用戶管理和權(quán)限管理
要在超級(jí)用戶上創(chuàng)建用戶權(quán)限
--創(chuàng)建用戶
create user zw identified by 123456;
--給zw登入的權(quán)限
grant connect to zw;
--授權(quán)
--用系統(tǒng)權(quán)限的方式
grant create table to zw;
--用角色方式
grant resource to zw;
--例:
create user username identified by password;
grant resource,connect to username;
-----------------GRANT語(yǔ)句
--GRANT語(yǔ)句的作用是賦與用戶權(quán)限。
--常用的數(shù)據(jù)對(duì)象權(quán)限有以下六個(gè):
--(1)ALL ON 數(shù)據(jù)對(duì)象名
--(2)SELECT ON 數(shù)據(jù)對(duì)象名
--(3)UPDATE ON 數(shù)據(jù)對(duì)象名
--(4)DELETE ON 數(shù)據(jù)對(duì)象名
--(5)INSERT ON 數(shù)據(jù)對(duì)象名
--(6)ALTER ON 數(shù)據(jù)對(duì)象名
--例:
--把查詢department表權(quán)限給zw用戶
grant select on department to zw
--把所有操作department表權(quán)限給zw用戶
grant all on department to zw
----------------REVOKE語(yǔ)句
--REVOKE語(yǔ)句是回收權(quán)限語(yǔ)句。回收以上所賦權(quán)限的相應(yīng)語(yǔ)句為:
--REVOKE CONNECT FROM USER1;
--REVOKE SELECT ON TABLE2 FROM USER2;
--REVOKE SELECT,INSERT,DELETE ON TABLE3 FROM USER1,USER2;
--例:
--回收sun用戶對(duì)SZD用戶的emp表的查詢權(quán)限
revoke select on emp from sun
--回收sun用戶對(duì)SZD用戶的emp表的所有權(quán)限
revoke all on emp from sun
備份與恢復(fù)
數(shù)據(jù)庫(kù)導(dǎo)出的四種模式full(全庫(kù)導(dǎo)出), owner(用戶導(dǎo)出), table(表導(dǎo)出), tablespace(表空間導(dǎo)出
執(zhí)行exp 有三種方法交互式命令行和參數(shù)文件。
1:交互式直接輸入exp 命令用戶可以按照exp 提示的信息一步一步操作比較簡(jiǎn)單.
2:命令行輸入命令行exp username/password parameter=value.
3:參數(shù)文件輸入命令行exp username/password parfile=filename exp 所需的參數(shù)從參數(shù)文件引入。
熱備份和冷備份:
熱備份針對(duì)歸檔模式的數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)仍舊處于工作狀態(tài)時(shí)進(jìn)行備份。而冷備份指在數(shù)據(jù)庫(kù)關(guān)閉后,進(jìn)行備份,適用于所有模式的數(shù)據(jù)庫(kù)。
熱備份的優(yōu)點(diǎn)在于當(dāng)備份時(shí),數(shù)據(jù)庫(kù)仍舊可以被使用并且可以將數(shù)據(jù)庫(kù)恢復(fù)到任意一個(gè)時(shí)間點(diǎn)。冷備份的優(yōu)點(diǎn)在于它的備份和恢復(fù)操作相當(dāng)簡(jiǎn)單,并且由于冷備份的數(shù)據(jù)庫(kù)可以工作在非歸檔模式下,數(shù)據(jù)庫(kù)性能會(huì)比歸檔模式稍好。(因?yàn)椴槐貙rchive log寫入硬盤)
索引
索引是一種樹狀結(jié)構(gòu),可以通過該結(jié)構(gòu)迅速訪問表中的數(shù)據(jù)。
索引的類型和其語(yǔ)法:唯一索引,組合索引,反向鍵索引,位圖索引,基于函數(shù)的索引。
1、唯一索引可以確保在定義索引的列中,表的任意兩行的值都不相同,Oracle自動(dòng)為表的主鍵列創(chuàng)建唯一索引。
其語(yǔ)法為:CREATE UNIQUE INDEX index_name ON table_name(column_name);
2、組合索引是在表中的多個(gè)列上創(chuàng)建的索引,可以提高檢索數(shù)據(jù)的速度。
其語(yǔ)法為:CREATE INDEX index_name ON table_name(column_name);
3、反向鍵索引通常建立在一些值連續(xù)增長(zhǎng)的列上,可以提高讀取的性能。
其語(yǔ)法為:CREATE INDEX index_name ON table_name(column_name) REVERSE;
4、位圖索引適用于低基數(shù)列,也就是不同值的數(shù)目比表的行數(shù)少的列。
其語(yǔ)法為:CREATE BITMAP INDEX index_name ON table_name(column_name);
5、基于函數(shù)的索引是指基于一個(gè)或多個(gè)列上的函數(shù)或表達(dá)式創(chuàng)建的索引,便于WHERE子句中包含函數(shù)或表達(dá)式以計(jì)算查詢時(shí)使用。
其語(yǔ)法為:CREATE INDEX index_name ON table_name(表達(dá)式或函數(shù));
racle索引包含B-tree索引、bitmap索引、函數(shù)索引等。
B-tree索引類似二叉樹結(jié)構(gòu),數(shù)據(jù)庫(kù)表中每一行都對(duì)應(yīng)R-tree索引中的一個(gè)節(jié)點(diǎn)。
節(jié)點(diǎn)中包含數(shù)據(jù)(索引列)和rowid信息,通過索引列找到對(duì)應(yīng)的rowid信息,在定位到具體的行來(lái)查找數(shù)據(jù)。
如果平凡刪除操作,會(huì)對(duì)相應(yīng)的索引作對(duì)應(yīng)的修改,會(huì)降低性能。建議在操作之前先刪除索引再重建索引。
補(bǔ)充:
創(chuàng)建索引語(yǔ)法:create index index_name on itemfile (itemcode)
刪除索引語(yǔ)法:drop index index_name;
重建索引語(yǔ)法:alter index index_name rebuild;
重命名索引:alter index item_index rename to book_index;
索引的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):某些情況下,數(shù)據(jù)查找快。
如:用戶的查詢將要選取記錄的2%-5%或更多,那么它將會(huì)執(zhí)行全部掃描,而不考慮索引是否可用
缺點(diǎn):
a)在某些條件下,全表掃描比索引查找更快
b)索引占用空間驚人,甚至超過表數(shù)據(jù)所占空間,不利于管理。
c)創(chuàng)建索引后,會(huì)降低插入,修改,刪除等操作的效率
選擇索引
a.身份證這類唯一屬性,應(yīng)建唯一索引
b.性別,只有男、女、未定等少數(shù)幾種狀態(tài)值,應(yīng)創(chuàng)建位圖索引,位圖索引更節(jié)約空間
c.對(duì)字段使用函數(shù),不會(huì)使用索引,可創(chuàng)建函數(shù)索引。
下列的表不適合建索引:
a.表很小(8K)
b.列不經(jīng)常在WHERE子句中使用
c.表中的相關(guān)列經(jīng)常被修改
Oracle優(yōu)化
SQL優(yōu)化實(shí)例:
– 選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效)
– WHERE子句中的連接順序
– SELECT子句中避免使用 *
– 減少訪問數(shù)據(jù)庫(kù)的次數(shù)
– 最高效的刪除重復(fù)記錄方法
– 用TRUNCATE替代DELETE
– 盡量多使用COMMIT
– 用Where子句替換HAVING子句
– 使用表的別名(Alias)
– 用EXISTS替代IN
– 用NOT EXISTS替代NOT IN
用表連接替換EXISTS
– 用EXPLAIN PLAN 分析SQL語(yǔ)句
– 避免在索引列上使用計(jì)算
– 用>=替代>
– 避免在索引列上使用IS NULL和IS NOT NULL
– 用UNION-ALL 替換UNION ( 如果有可能的話)
– 需要當(dāng)心的WHERE子句