Resource:
Oracle 服務(wù)器端組成:
1.內(nèi)存中的instance (數(shù)據(jù)庫對應(yīng)的實(shí)例)
2.磁盤上的database (數(shù)據(jù)文件,日志,參數(shù)文件…)
對應(yīng)關(guān)系: 1:1(單實(shí)例) , N:1(集群RAC,每個(gè)主機(jī)一個(gè)數(shù)據(jù)庫實(shí)例,共享一個(gè)磁盤陣列)
Listener
運(yùn)行于服務(wù)器上,用于客戶機(jī)遠(yuǎn)程連接數(shù)據(jù)庫,支持多協(xié)議,TCP/IP對應(yīng)默認(rèn)端口為1521
DML CRUD(insert,select,update,delete)
DDL alter,create , drop…
TCL (transactioncontrol lang ) commit, rollback,savepoint
DCL (datacontrol lang) grant revoke
網(wǎng)絡(luò)配置助手 (net configuration assistant, netca)設(shè)置本地Net服務(wù). 登陸遠(yuǎn)程服務(wù)器。
也可以直接修改xxxx.ora文件,復(fù)制到指定目錄,通助手設(shè)置效果相同。
C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN
sqlnet.ora
tnsnames.ora 解析數(shù)據(jù)庫名在oracle中使用類似DNS的方式,該文件作用類似于網(wǎng)絡(luò)中的host文件
Cmd 連接數(shù)據(jù)庫sas
sqlplus /nolog (不登陸,只是打開sqlplus)
conn oe/oe@sas
或者
sqlplus oe/oe@sas
管理員登陸
conn sys/pwd@sas assysdba
如果用戶在操作系統(tǒng)的權(quán)限很高,可省略用戶名和密碼。conn / as sysdba;
數(shù)據(jù)庫與關(guān)系代數(shù)的關(guān)系、
字符串區(qū)分大小寫,如果不清楚大小寫,用upper/lower函數(shù)
Select * from employees where upper(last_name) = ‘KING’;
但是如果sql中where 語句后的等號(hào)左邊存在函數(shù),則oracle中對該字段的索引無效,走全行掃描,性能低。
字符串使用單引號(hào)
Oracle中的字典表(比如當(dāng)前用戶下的各個(gè)表對象組成的表),字典表中對象的名字都是大寫。
select table_name from user_tables; --user_tables就是個(gè)字典表
select * from user_tables where table_name = 'CUSTOMERS';--CUSTOMERS是大寫
空值NULL 不知道是什么
一個(gè)運(yùn)算表達(dá)式中,只要存在一個(gè)空值,結(jié)果一定是Null.
由于空值的存在會(huì)導(dǎo)致運(yùn)算的麻煩,設(shè)計(jì)時(shí)應(yīng)當(dāng)盡量避免空值產(chǎn)生。
注意
T and NULL = NULL, F and NULL = F,
因?yàn)?/span>NULL是T還是F未知,T & T =T, F&T = F, 因此結(jié)果無法判斷,是null
但是T&F= F&F = F, 因此 null & f =f
列的別名
在列的名稱后可以緊跟別名—或者使用可選的關(guān)鍵字AS放在列名和別名之間
如果別名包含空格或特殊字符或?qū)Υ笮懨舾校?span style="color: red;">需要雙引號(hào)引用
*表空間備份之前,要設(shè)置表空間進(jìn)入備份模式
alert tablespace tbs01 begin backup;
一個(gè)一個(gè)做很麻煩,可以這樣
Select name from v$tablespace; 獲得所有表空間
Select ‘alter’ || name|| ‘ begin backup’ from v$tablespace;
則得到生成的語句串
要保存到文件,利用假脫機(jī)功能
spool c:\script.sql
set head off – 去掉結(jié)果中的標(biāo)題,還有很多類似的設(shè)置
select ‘alter’ || name|| ‘ begin backup’ from v$tablespace;
spool off
count 的問題
select count(department_id) from (select distinct department_id from employees)
select count(*) from (select distinct department_id from employees)
如果department_id有為空的,那么結(jié)果不同,原因是count(department_id)會(huì)不計(jì)算空值的行。
可以理解為department_id列結(jié)果集中計(jì)算有多少個(gè)有值的行。
而count(*)把結(jié)果集中所有的行都算上,而不管行中的列有沒有值。
其中前者可簡化 select count(distinct department_id) from employees;
單引號(hào)字符串使用單引號(hào),當(dāng)數(shù)字與字符做比較時(shí),也可以給數(shù)字加上單引號(hào)來說明是作為字符來比較,不是必須的。
一般多行函數(shù)都會(huì)先把空值去掉再做計(jì)算。比如AVG,SUM等。
日期是格式敏感的
默認(rèn)格式是dd-mm-yy
用 to_date(‘1987-01-12’,’yyyy-mm-dd’) 可將習(xí)慣的時(shí)間格式轉(zhuǎn)換為日期
Oracle 的時(shí)間抽取函數(shù) extract (year from hire_date)
ORDER BY 在select 語句最后出現(xiàn)
默認(rèn)ASC,多列排序 修飾符只修飾緊前一個(gè)。
NLS : national - language - support
修改會(huì)話設(shè)置
alter sessionset xxx = xxx;
優(yōu)先級 : 會(huì)話設(shè)置 > 環(huán)境變量 > 服務(wù)器默認(rèn)值
VCHAR 與 VARCHAR2 一樣。VCHAR2 是 Oracle 自己定義的,方便日后升級。
隱藏?cái)?shù)據(jù)類型轉(zhuǎn)換也會(huì)導(dǎo)致某字段索引失效。
set autotrace on 追蹤執(zhí)行計(jì)劃, 查看語句執(zhí)行過程。
to_char, to_number,to_date
空值的問題,即導(dǎo)致上面COUNT問題的原因。很多函數(shù)會(huì)先去掉空值的行。
可使用NVL來給空值指定一個(gè)值。
NVL(arg1,arg2) 其中arg1,arg2的值類型必須相同(可以用函數(shù)轉(zhuǎn)換解決不同類型匹配)
例如 NVL(to_char(manager_id),‘NO MANAGER’);
CASE 和 DECODE 只能處理簡單的邏輯分支,復(fù)雜情況可使用PL/SQL。
連接:
等值連接即內(nèi)連接
外連接
外連接: 左連接,右連接( 根據(jù)表在逗號(hào)的左右判斷)
完全外連接(等值+左+右的結(jié)果)
語法:字段(+), 如果(+)在等號(hào)右邊,則是左外連接,否則反之。 注意(+) 與左右概念是相反位置的。
所有在SELECT列表中出現(xiàn)的列,如果未使用組函
數(shù),那么它必須出現(xiàn)在GROUPBY子句中
Where 在分組之前、針對每行進(jìn)行篩選。
Having 在分組后、對分組運(yùn)算結(jié)果進(jìn)行篩選
因此:
你無法通過WHERE子句限定組
使用HAVING子句可以限定組
不能在WHERE子句中使用組函數(shù)
Select
Select department_id,job_id , count(*)from employees group by deparment_id, job_id;
分組的擴(kuò)展關(guān)鍵字
Rollup(上卷) rollup(a,b,c) 分別按照a,b,c a,b a all 進(jìn)行分組。若有n個(gè)字段,則分組n+1次。如下測試:
Select department_id,job_id, count(*) from employees
group byrollup(deparment_id, job_id);
department_id, job_id
department_id
all
Cube 2^n 種分組情況。 Cube(department_id,job_id)
四種情況
department_id, job_id
department_id,
job_id
all
如果沒有這兩個(gè)關(guān)鍵字,可以使用union all 將多個(gè)情況的結(jié)果構(gòu)造并集,但是麻煩。
單行子查詢必須返回一行數(shù)據(jù)(空行和多行都不允許)> < = <> >= <=
多行子查詢 ANY, IN ,ALL
Create table t1 as select * from employees;
Create table t1 as select * from employeeswhere 1=0; 只復(fù)制結(jié)構(gòu)
上述方式不會(huì)復(fù)制外鍵,索引,主鍵等約束。
刪除表內(nèi)容:
delete from t1; DML不自動(dòng)提交 除非正常關(guān)閉sqlplus.
truncate table t1 (oracle 自帶); DDL
空間管理:delete 刪除數(shù)據(jù)后不釋放空間, 而truncate釋放空間。
重做數(shù)據(jù):delete 生成,寫日志,生成undo data (可能慢),truncate 不生成
Undo data 更新前的舊數(shù)據(jù),在撤銷表空間
Redo data 更新后的新數(shù)據(jù)
Oracle sqlplus中的事務(wù):
• 以第一個(gè)DML SQL語句執(zhí)行開始
• 以下面的事件為止
—COMMIT或者ROLLBACK語句被執(zhí)行
— 一個(gè)DDL或者DCL語句執(zhí)行(自動(dòng)提交)
— 用戶退出SQL*Plus
— 系統(tǒng)崩潰
使用COMMIT和ROLLBACK語句,你可以
• 確保數(shù)據(jù)一致
• 在做永久改變之前可以預(yù)覽數(shù)據(jù)改變
• 組邏輯上的相關(guān)操作
在COMMIT之后的數(shù)據(jù)狀態(tài)
• 數(shù)據(jù)庫中數(shù)據(jù)的改變被永久化不會(huì)丟失,即使系統(tǒng)崩潰。
• 事務(wù)結(jié)構(gòu),舊事務(wù)狀態(tài)被清除,新事務(wù)開始。
• 舊事務(wù)中的鎖定的行被釋放,這些行現(xiàn)在可以被其它用戶進(jìn)行操作。
在Rollback之后數(shù)據(jù)的狀態(tài)
• 數(shù)據(jù)的改變被撤回
• 數(shù)據(jù)先前的狀態(tài)被還原
• 受影響行上面的鎖被釋放
在下列環(huán)境下自動(dòng)提交會(huì)發(fā)生
—DDL語句被執(zhí)行
—DCL語句被執(zhí)行
— 從SQL*Plus中的正常退出,沒有顯式執(zhí)行COMMIT或者ROLLBACK語句
• 在SQL*Plus非正常結(jié)束或者系統(tǒng)失敗,自動(dòng)回滾發(fā)生。
DB 內(nèi)部調(diào)度要遵循可串行化規(guī)則,前后順序不能變。(參考老胡的PPT)
ORACLE事務(wù)的隔離級別(獨(dú)立方式) 讀已提交、連續(xù)讀(可串行化)
沒有提交的數(shù)據(jù),其他用戶是看不到的,即處在 讀已提交 隔離級別。
可能出現(xiàn) 不可重復(fù)讀 現(xiàn)象,即兩次讀取的數(shù)據(jù)可能不一樣(被更新了)
Oracle 的語句一致性(多版本并發(fā)控制,不同于其他DB):
1 語句級別一致性, 當(dāng)執(zhí)行一個(gè)語句,數(shù)據(jù)與按下回車的那一刻是一致的。
2 事務(wù)一致性,得到的數(shù)據(jù)與事務(wù)開始的那一刻是一致的。
默認(rèn)在語句級別的一致性。
事務(wù)一致性在可串行化級別中實(shí)現(xiàn)。同一個(gè)查詢,在一個(gè)事務(wù)中得到的結(jié)果是一樣的,看不到別人的修改。
Oracle與SQLSERVER/DB2 處理方式不同, 事務(wù)A開始后,Oracle允許B修改事務(wù)A的數(shù)據(jù),而SQLSERVER/DB2 會(huì)掛起B的操作直到A事務(wù)完成。如果B修改了A的數(shù)據(jù),A可能無法再修改那些數(shù)據(jù),因?yàn)闊o法保證可串行化。
不可重復(fù)讀與幻象讀
不可重復(fù)讀:對原有數(shù)據(jù)的修改被讀取
幻象讀:原有數(shù)據(jù)不變,添加了新的數(shù)據(jù)后被讀取
Level dirtiy read nonreaptableread phantom read
Read uncommitted
不加鎖
Read commited
鎖定當(dāng)前游標(biāo)所處理的記錄
Repeatable read
鎖定當(dāng)前處理的數(shù)據(jù)
Serlizable
鎖定事務(wù)
鎖: share exlusive
Share y y
Exlusive n
Oracle redo data 在redo log, undo data 在undo tablespace(公開可訪問),并發(fā)時(shí)其他人可能訪問舊數(shù)據(jù)。Oracle中共享鎖和排他鎖可共存,即當(dāng)事務(wù)A寫數(shù)據(jù)X并且未提交時(shí),
事務(wù)B可以訪問X的舊數(shù)據(jù)(共享讀),但是不能寫X(排他寫)。
其他db 新舊數(shù)據(jù)都在redo log, 并發(fā)時(shí)只能等待。
Oracle不會(huì)預(yù)防死鎖,但是會(huì)檢測,死鎖必然是業(yè)務(wù)邏輯造成的。
鎖的升級:MSSQLServer,DB2 會(huì)將鎖保存到鎖鏈表中,可能會(huì)將整個(gè)表鎖住。
Oracle不做鎖的升級。
請求鎖而得不到操作會(huì)被阻塞。
查詢時(shí)加鎖(悲觀加鎖): select xxx from yyy for update;
Oracle 有DML鎖、DDL鎖、內(nèi)部鎖(栓) 三類鎖。
栓用于鎖定內(nèi)存結(jié)構(gòu),
一般鎖可能持續(xù)很長時(shí)間,栓持續(xù)時(shí)間很短。
鎖一般是隊(duì)列方式獲得鎖
栓是搶先機(jī)制,無隊(duì)列
字典表
用戶下的User_table, user_view, user_xxxxx…
管理員的 Dba_table,…
所有有權(quán)限訪問的 Full_table,….
表間外鍵約束,進(jìn)行如下操作該表是否受約束影響
Ins upd del
父 n y y
子 y y n
約束不能修改 ,只能刪除重建
虛表,只包含一個(gè)查詢公式,每次訪問時(shí)都執(zhí)行公式一次。
簡單視圖可以通過視圖的DML操作改變基表,然而也不一定,例如
T1
x int not null, y int
v1
select y from t1;
如果對v1進(jìn)行插入操作,由于x not null的存在,將無法進(jìn)行插入。
可以使用替代觸發(fā)器(取消用戶的操作,以其他操作來替代)來解決,當(dāng)插入操作進(jìn)行時(shí),自動(dòng)設(shè)置x的值。
With check option 語句根據(jù)創(chuàng)建視圖時(shí)的where語句條件劃定的集合,對DML進(jìn)行限制,如果修改的數(shù)據(jù)不符合這個(gè)條件,則拒絕DML操作。
TOP-n分析
找y最大的前三個(gè)。
Select * from t1 whererownum <=3 order by y desc;
上述寫法錯(cuò)誤,因?yàn)檎Z句先按照where篩選,只得到前三行數(shù)據(jù),因此結(jié)果錯(cuò)誤。
利用
Select * from (select *from t1 order by y desc) where rownum <=3;
或者將子查詢用視圖臨時(shí)保存下來。
注意! 當(dāng)訪問某行且條件不滿足時(shí),rownum不會(huì)增加,因?yàn)?/span>rownum是結(jié)果集的行號(hào)!因此不能使用between and 來查詢中間第xx 到yy范圍的數(shù)據(jù)。
可以使用集合minus來查詢中間范圍段.
序列的nextval,curval 都不可以更改,只能刪掉重建。
查看執(zhí)行計(jì)劃
Set autotrace on
當(dāng)開始一個(gè)查詢,系統(tǒng)首先查詢字典表獲取一些信息(recursive calls 遞歸調(diào)用次數(shù))。
當(dāng)獲取這些信息后,會(huì)緩存到內(nèi)存,下次查詢該表時(shí),遞歸調(diào)用開銷就小了。
十三章 優(yōu)化部分不作要求。
基數(shù)(一個(gè)字段值中不重復(fù)值的個(gè)數(shù))
Btree 索引: 適用于高基數(shù)的字段, 等值查詢
Bitmap索引 適用于大量重復(fù)值,低基數(shù)的字段上, 大量邏輯條件判斷。
Hash索引. Oracle不允許。
集合運(yùn)算
并 Union(合并時(shí)會(huì)去掉重復(fù)值, 后臺(tái)會(huì)排序可能影響效率), union all(不去除重復(fù)值).
Intersect 交集
Minus 相減
SQL的擴(kuò)展,用于程序設(shè)計(jì)語言。
數(shù)據(jù)查詢,維護(hù)SQL語句包含在存儲(chǔ)過程中,作為代碼組成部分。
游標(biāo)和活動(dòng)集 就是 指針和數(shù)組的關(guān)系。
包有聲明和實(shí)現(xiàn)兩部分。
能處理的有: 存儲(chǔ)過程 函數(shù) 觸發(fā)器包 等。
塊
匿名塊 存儲(chǔ)過程 函數(shù) 觸發(fā)器
如果一個(gè)塊要被頻繁調(diào)用,應(yīng)當(dāng)寫成存儲(chǔ)過程或者函數(shù)。
TIMESTAMP 比Date 更精確
用單引號(hào)界定字符串,字符串內(nèi)的單引號(hào)用兩個(gè)單引號(hào)轉(zhuǎn)義。
NULL是真是假無法判斷。
組合數(shù)據(jù)類型:
Tables 類似數(shù)組
記錄record類似于結(jié)構(gòu)體。
PLSQL只允許DML語句執(zhí)行,如果要執(zhí)行DDL,要使用Execute immediate 來動(dòng)態(tài)執(zhí)行語句。
(類似于js 的eval ?)
Varchar2(30) 是按照字節(jié)分配的
Varchar2(30 char) 是按字符分配的(一個(gè)字符根據(jù)編碼不同占用字節(jié)數(shù)不同)
可變數(shù)組 VARRAY
聯(lián)合數(shù)組xxtype IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER 下標(biāo)在正負(fù)范圍內(nèi)隨便寫,根據(jù)表格屬性來訪問下標(biāo)。
….睡著了
PL/SQL 中的select 只能獲取一行數(shù)據(jù),沒有或者多行都是異常。
系統(tǒng)優(yōu)先將變量名解析為列,因此不要使用跟列名同名的變量名!
繼續(xù)走神。。。
條件空值語句
在判斷真假時(shí),出現(xiàn)NULL,無法判斷真假,在while, if 等判斷中都是只在值為真的時(shí)候才執(zhí)行。
PLSQL的for 循環(huán)無法實(shí)現(xiàn)非1(-1)步長的循環(huán)。
循環(huán)中的循環(huán)變量是自動(dòng)增加的,且其作用域是在循環(huán)塊內(nèi),當(dāng)與外部變量同名時(shí)覆蓋。
游標(biāo)分隱式和顯示。每條語句執(zhí)行時(shí),都會(huì)產(chǎn)生游標(biāo)。
隱式:在聲明DML 和PL/SQL 中SELECT 語句時(shí)自動(dòng)產(chǎn)生的游標(biāo)。
顯示:在程序中定義。
Declare –>open >fetch <> empty ? >close
Declare
Cursor cur_name IS
Select…;
BEGIN
Open cur_name;
Fetch cur_name intovar1, var2..;
Fetch cur_name intorecord_var1;
Close cur_name;
END
使用循環(huán)獲取多行數(shù)據(jù)。
1普通循環(huán),自己做open fetch close 操作
Open cur
LOOP
Fetch cur into xxxx…;
Exit when cur%NOTFOUND;
Do something…
END LOOP;
Close cur;
2 用于游標(biāo)的循環(huán) for in , 省略了open fetch close 操作,使用方式簡潔。
游標(biāo)不能重復(fù)打開,要再次打開,要先close
記住Forin 方式使用游標(biāo)會(huì)自動(dòng)打開游標(biāo)。
Into 的列數(shù)要與cursor定義的一致。
游標(biāo)使用完畢記得要關(guān)閉,以釋放內(nèi)存。
FETCH 之后游標(biāo)才移動(dòng)到該行,因?yàn)?/span>fetch之后還可以做NOTFOUND檢測。
游標(biāo)取值失敗后,不會(huì)將之前的變量值覆蓋,可能造成數(shù)據(jù)重復(fù)。
參數(shù)游標(biāo) : 確定指向哪個(gè)表,但是查詢參數(shù)可變
Cursor xx(v1,v1..) IS …;
Open xx(val1,val2..);
…
參照游標(biāo) :不確定指向哪個(gè)表。
更新游標(biāo)(for update & current of)
Cursor cur_name is
Select … forupdate; // 將字段悲觀鎖定
如果改成 select xx for update of xx; 則只鎖定某個(gè)字段。
Begin
….
Update xx where current of cursor_name; 更新游標(biāo)指向的行。
游標(biāo)與事務(wù)
一般的游標(biāo)不會(huì)產(chǎn)生鎖
更新游標(biāo)
• 打開游標(biāo)前沒有鎖
• 使用for update nowait檢測鎖的沖突
• 打開游標(biāo)后產(chǎn)生鎖(TM:RS,TX:X)
• 關(guān)閉游標(biāo)后,鎖直到commit或rollback結(jié)束事務(wù)才釋放
使用更新游標(biāo)過程中不要COMMIT或ROLLBACK(不用for update時(shí)沒事)
隱式游標(biāo)可以使用%NOTFOUND屬性,但是不能用%ISOPEN
存儲(chǔ)過程,函數(shù),觸發(fā)器,包
參數(shù)類型:
IN 當(dāng)作常量使用,不允許作為左值出現(xiàn), 傳參為引用類型。
OUT/INOUT 左右都可以,傳參時(shí)會(huì)將值復(fù)制。
INOUT使用NOCOPY可以不復(fù)制,直接傳引用,提高效率。
存儲(chǔ)過程可以重載。
//走神中。。。
觸發(fā)器 與 審計(jì)
審計(jì)只要有操作就觸發(fā),且無論操作成功還是失敗
觸發(fā)器在insert,update,delete觸發(fā)。觸發(fā)器如果不提交,會(huì)被回滾。
觸發(fā)器可以觸發(fā)操作,而審計(jì)只會(huì)在日志中寫入記錄。
For each row 加在creat xx … on yy 后面,則是行級別的觸發(fā)器,不加是語句級別的。
兩個(gè)記錄變量 冒號(hào)new/old
:new update/insert時(shí),是將要插入或者更新的新數(shù)據(jù),如果是delete則是空。
:old 如果是insert,則是空,如果是update則是更新前的數(shù)據(jù),如果是delete, 則是要?jiǎng)h除的數(shù)據(jù)。
如果插入數(shù)據(jù)不合規(guī)范,可以對:new進(jìn)行整理,然后執(zhí)行插入,則:new中的數(shù)據(jù)會(huì)插入行。
比如將序列用觸發(fā)器寫入id值:
在before update/insert 創(chuàng)建觸發(fā)器,執(zhí)行
Select seq.nextval into:new.id from dual;
觸發(fā)器觸發(fā)順序:
1 語句級別的before
2 行級別before的觸發(fā)器,如果級別相同,先執(zhí)行后定義的。
3 處理數(shù)據(jù)
4 行級別的after, 同級執(zhí)行后定義的
5 下一行。。。
6 語句級別的after
觸發(fā)器級別
模式級別(用戶), 數(shù)據(jù)庫級別
Oracle 體系結(jié)構(gòu)
實(shí)例,數(shù)據(jù)庫
----SGA 系統(tǒng)全局區(qū)
1. shared pool 語句的解析、執(zhí)行計(jì)劃的緩存池,適度大小
2. Db buffercache 操作影響的數(shù)據(jù)塊,越大越好,命中率越高
3. Log buffer 將Log積累到一定量一次性寫入
4. Large pool [可選] 備份/恢復(fù)的工作緩存區(qū),如果沒有大池,則使用共享池
5. Java pool[可選] 對java應(yīng)用的支持,分配給它的緩存
----background process 后臺(tái)進(jìn)程
Smon 系統(tǒng)監(jiān)視器(監(jiān)視服務(wù)器)
Pmon 進(jìn)程監(jiān)視器(監(jiān)視客戶端)
Dbw(database writer 數(shù)據(jù)庫寫進(jìn)程) 將內(nèi)存里的臟數(shù)據(jù)塊寫入磁盤,臟數(shù)據(jù)即在內(nèi)存中被修改的數(shù)據(jù)(與磁盤上不一致的)
數(shù)據(jù)庫的瓶頸就在內(nèi)存與磁盤的讀寫的(即IO),因此減少IO是數(shù)據(jù)庫設(shè)計(jì)的要點(diǎn)。
寫數(shù)據(jù)的條件:
no free buffer
dirty xxx 臟數(shù)據(jù)塊累計(jì)到一定量時(shí)
time out
tbs offline 離線表空間
LGWR 日志寫進(jìn)程
1. 寫觸發(fā)條件:
2. Log buffer 1/3滿時(shí)
3. 生成 1M redo data 時(shí)
4. Per 3 seconds
5. Commit,定義ACID,指數(shù)據(jù)庫事務(wù)正確執(zhí)行的四個(gè)基本要素的縮寫.包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。Commit 時(shí)寫入日志保證事務(wù)操作的持久性。
6. 在數(shù)據(jù)庫進(jìn)程寫之前,要將日志寫磁盤。
Chpt 當(dāng)檢測點(diǎn)出現(xiàn),就一定要將內(nèi)存中的臟數(shù)據(jù)寫入數(shù)據(jù)庫。每隔一定時(shí)間要出現(xiàn)檢查點(diǎn),當(dāng)出現(xiàn)問題時(shí),可以回復(fù)到最后一個(gè)檢查點(diǎn)。 檢查點(diǎn)是性能和可恢復(fù)性之間的權(quán)衡。檢查點(diǎn)越頻繁,性能低,但是可恢復(fù)性強(qiáng)了。
Arch 歸檔
----PGA 程序全局區(qū)
每個(gè)服務(wù)器進(jìn)程都有一個(gè)PGA, 排序操作就是發(fā)生在PGA內(nèi)存中,由進(jìn)程自己使用。
----server process 數(shù)據(jù)庫進(jìn)程
DATABASE 數(shù)據(jù)庫:
Control file控制文件:包含很多重要的狀態(tài)信息,有多個(gè)相同的鏡像文件來保護(hù)這些信息,啟動(dòng)數(shù)據(jù)庫時(shí)要求幾個(gè)文件都在正常狀態(tài),寫入時(shí)向幾個(gè)文件都寫入。一般是兩三個(gè)文件,最好分配在不同的磁盤上。
Data file 數(shù)據(jù)文件:邏輯上跟表空間對應(yīng)的,一個(gè)或多個(gè)數(shù)據(jù)文件構(gòu)成一個(gè)表空間。一般以dbf坐后綴。
Log file
Initial parameter file spfileSID.ora
Password file
繼續(xù)走神。。。。。。。
數(shù)據(jù)字典:字典表,動(dòng)態(tài)性能表
區(qū)別:名字,存儲(chǔ),數(shù)據(jù)來源
怎樣使用字典表
DBA_xxx
Oe_xxx
用戶,方案對象,存儲(chǔ)結(jié)構(gòu)
一般是只讀。當(dāng)我們執(zhí)行DDL時(shí),由數(shù)據(jù)庫自己去修改字典表。
動(dòng)態(tài)性能表
以V$為前綴。V$process , v$session, V$sga ….
記錄數(shù)據(jù)庫當(dāng)前的活動(dòng)、狀態(tài)、標(biāo)志等。由SYS用戶所有,不允許DML.
系統(tǒng)關(guān)閉后,字典表會(huì)保留在磁盤,動(dòng)態(tài)性能視圖不會(huì)保留。
在優(yōu)化過程中,通過動(dòng)態(tài)視圖監(jiān)控?cái)?shù)據(jù)庫的話,那么要保證在監(jiān)控期間數(shù)據(jù)庫不間斷運(yùn)行,應(yīng)確定好采樣范圍是有代表性的。
Physical物理結(jié)構(gòu)
1. Data file, 由os block 組成。
Logical 邏輯結(jié)構(gòu)
Db block( oracle 的塊,是os block的整數(shù)倍, db_block_size 參數(shù)決定, 例如16k, io 的最小單位),
多個(gè)db block 構(gòu)成一個(gè)extend(擴(kuò)展,或者叫區(qū)).
Extend 是空間分配的最小單位。
多個(gè)extend 構(gòu)成一個(gè)段segment,段對應(yīng)一個(gè)實(shí)際的對象,比如一個(gè)表,一個(gè)索引,但是視圖不是,視圖只是個(gè)定義,不會(huì)消耗磁盤空間??赡艹霈F(xiàn)一張表是由多個(gè)段構(gòu)成的,比如分區(qū)表。
段再構(gòu)成tablespace.
Table, index 可能跨多個(gè)db file進(jìn)行存儲(chǔ),修改table,index的內(nèi)容可能導(dǎo)致多個(gè)文件大小同時(shí)改變。
物理文件和表空間對應(yīng)。
系統(tǒng)表空間
非系統(tǒng)表空間 見課件
空間管理方式:
DMT :dictionary 字典管理表空間, 表空間的區(qū)的分配是由字典管理的。
LMT :local 本地管理表空間, 區(qū)是由本地表空間來管理的。( 9+版本)
建議在Oracle中,有自動(dòng)選項(xiàng)的,盡量勾選。
不建議使用多個(gè)小文件來構(gòu)建一個(gè)表空間,建議使用一個(gè)大文件來存儲(chǔ)。
Oracle 自動(dòng)管理空間方式
Dba_segments 段字典
Dba_extends 區(qū)字典, 區(qū)的大小是根據(jù)數(shù)據(jù)量調(diào)整的。
Pctfree
Pctused
當(dāng)一個(gè)塊裝滿后,某條記錄數(shù)據(jù)增多,會(huì)導(dǎo)致行遷移,系統(tǒng)在另一個(gè)塊中存儲(chǔ)該行,然后在原位置留一個(gè)指針指向那一行。之所以這么做,是因?yàn)楫?dāng)插入一個(gè)行時(shí),系統(tǒng)分配一個(gè)行標(biāo)識(shí)符,即物理地址,而索引中是包含這個(gè)標(biāo)識(shí)符的,如果行遷移時(shí)修改行標(biāo)識(shí)符,則所有的索引都要改變,因此系統(tǒng)不修改行的位置,而是在那個(gè)位置添加指針。
為了避免行遷移,一個(gè)塊不應(yīng)當(dāng)裝的太滿,pctfree,pctused用于指定一個(gè)塊裝了多少的時(shí)候允許插入數(shù)據(jù)。
聯(lián)系客服