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