一、管理數(shù)據(jù)塊空間
?
??? 數(shù)據(jù)塊的大小是在創(chuàng)建的時(shí)候就已經(jīng)指定的,所以可以進(jìn)行修改的是數(shù)據(jù)塊的PCTFREE、PCTUSED參數(shù)。
?
??? 可以進(jìn)行以下的操作:
??? * 改善寫(xiě)入檢索數(shù)據(jù)時(shí)的性能
??? * 減少數(shù)據(jù)塊中未使用空間的數(shù)量
??? * 減少數(shù)據(jù)塊之間行鏈接的數(shù)量
?
??? 1、指定PCTFREE參數(shù)
?
??? PCTFREE參數(shù)用于設(shè)置為數(shù)據(jù)塊中需要保留的空閑百分比。例如:
?
???
?
??? PCTFREE的默認(rèn)值是10,可以設(shè)置0-99之間的任意數(shù)值,只需滿足 PCTFREE + PCTUSED <= 100 即可
?
??? PCTFREE的參數(shù)值設(shè)置可以滿足以下條件:
?
??? ① PCTFREE設(shè)置較小的作用:
??????? * 為盤(pán)區(qū)表中現(xiàn)有行的更新保留較少的空間
????????* 允許通過(guò)插入來(lái)更完整得填充數(shù)據(jù)塊
????????* 可以節(jié)省空間,因?yàn)楸砘蛩饕乃鰯?shù)據(jù)存儲(chǔ)在較少數(shù)據(jù)庫(kù)塊中
??? ② PCTFREE設(shè)置較大的作用:
??????? * 為表中現(xiàn)有行的將來(lái)更新保留更多的空間
??????? * 為同樣數(shù)量的插入數(shù)據(jù)申請(qǐng)更多的數(shù)據(jù)塊(每個(gè)數(shù)據(jù)塊利用較少)
??????? * 提高更新性能(無(wú)需頻繁鏈接行片)
??? ③ 非簇表的PCTFREE參數(shù)
??????? 非簇表行中的數(shù)據(jù)可能會(huì)隨時(shí)間推移增大則需要多留一些PCTFREE
??? ④ 簇表的PCTFREE參數(shù)
??????? 除了依照非簇表的規(guī)則外,達(dá)到PCTFREE百分比時(shí),同一簇碼的任何一個(gè)表新行進(jìn)入新塊時(shí)均會(huì)被鏈接到現(xiàn)有的簇碼
??? ⑤ 索引的PCTFREE參數(shù)
??????? 只能在初始創(chuàng)建索引時(shí)才能指定索引的PCTFREE值
?
??? 2、指定PCTUSED參數(shù)
?
??? 設(shè)置PCTUSED參數(shù),當(dāng)一個(gè)數(shù)據(jù)塊填滿到PCTFREE設(shè)置的百分比時(shí),只有在所用空間下降到PTCUSED參數(shù)值以下時(shí)才繼續(xù)為該數(shù)據(jù)塊插入新行。
例如:
?
???
?
??? PCTUSED的默認(rèn)值是40,同樣可以設(shè)置為0-99之間的任意數(shù)值。
?
??? PCTUSED的參數(shù)值設(shè)置可以滿足以下條件:
?
??? ① PCTUSED設(shè)置較小的作用:
??????? * 降到PCTUSED以下時(shí),減少在UPDATE和DELETE語(yǔ)句中因數(shù)據(jù)塊移動(dòng)到自由列表引起的處理開(kāi)銷
????????* 增加數(shù)據(jù)庫(kù)中的未用空間
??? ② PCTUSED設(shè)置較大的作用:
??????? * 提高空間利用率
??????? * INSERT和UPDATE語(yǔ)句中增加處理開(kāi)銷
?
??? 3、選擇PCTUSED和PCTFREE的參數(shù)值
?
??? 在設(shè)置PCTUSED和PCTFREE參數(shù)時(shí),需要注意以下幾點(diǎn):
?
??? * PCTFREE和PCTUSED參數(shù)之和必須等于或小于100
??? * 若兩者和為100,則Oracle只保持PCTFREE參數(shù)指定的空閑空間,且處理開(kāi)銷是最大的
??? * 兩者之和與100的差值越小,說(shuō)明空間利用率越高
?
??? 下面舉例說(shuō)明:
?
??? ① PCTFREE=20 PCTUSED=40
?
??? 環(huán)境:包括增大行大小的UPDATE語(yǔ)句的普通動(dòng)作。
??? 說(shuō)明:PCTFREE設(shè)置為20為UPDATE提供足夠的空間,PCTUSED設(shè)置為40以便更新時(shí)少做處理,提高性能。
?
??? ② PCTFREE=5? PCTUSED=60
?
??? 環(huán)境:包含INSERT和DELETE語(yǔ)句,以及不增大行大小的UPDATE。
??? 說(shuō)明:不增大行大小所以PCTFREE比較小,而PCTUSED設(shè)為60以便時(shí)使DELETE之后的空間馬上可以使用,且減少處理開(kāi)銷。
?
??? ③ PCTFREE=5? PCTUSED=40
?
??? 環(huán)境:表非常大且存儲(chǔ)是首要考慮,包含只讀事務(wù)的動(dòng)作。
??? 說(shuō)明:因?yàn)槭谴蟊恚栽O(shè)置PCTFREE為5,完全填充每個(gè)數(shù)據(jù)塊。
?
??? 4、指定事務(wù)入口(INITRANS、MAXTRANS)
?
??? INITRANS參數(shù)用于指定DML事務(wù)入口的數(shù)目,即為事務(wù)入口保留空間。
??? MAXTRANS參數(shù)用于限制一個(gè)數(shù)據(jù)塊中同時(shí)使用數(shù)據(jù)的事務(wù)入口數(shù)目。
?
??? INITRANS和MAXTRANS參數(shù)的設(shè)置需要考慮一下因素:
?
??? * 為事務(wù)入口保留的空間與為數(shù)據(jù)庫(kù)數(shù)據(jù)保留的空間相比較
??? * 任何時(shí)候可能訪問(wèn)同一數(shù)據(jù)塊的并發(fā)事務(wù)的數(shù)目
?
??? 例如:
?
??? ① 一個(gè)表非常大,并且只有少數(shù)的用戶同時(shí)訪問(wèn)該表,多個(gè)并發(fā)事務(wù)訪問(wèn)一個(gè)數(shù)據(jù)塊的機(jī)會(huì)就比較小,因此INITRANS可以設(shè)置得小一點(diǎn),特別是如果數(shù)據(jù)庫(kù)中的空間非常寶貴的情況下。
??? ② 一個(gè)表通常被很多用戶同時(shí)訪問(wèn),這時(shí)需要INITRANS設(shè)置得較大一些來(lái)與分配事務(wù)的入口,這樣就省去了必須分配事務(wù)入口空間的開(kāi)銷。同事設(shè)置一個(gè)較大的MAXTRANS參數(shù)值,以便沒(méi)有用戶為訪問(wèn)必要數(shù)據(jù)塊而造成的等待。
?
?
二、設(shè)置存儲(chǔ)參數(shù)
?
??? 1、確定存儲(chǔ)參數(shù)
?
??? 首先來(lái)看一個(gè)設(shè)定存儲(chǔ)參數(shù)的例子:
?
??? CREATE TABLE players
??? (code number(10) primary key,
???? lastname VARCHAR2(20),
???? firstname VARCHAR2(15),
???? position VARCHAR2(20),
???? team VARCHAR2(20))
??? PCTFREE 10
??? PCTUSED 40
??? STORAGE
??? (INITIAL 25K
???? NEXT 10K
???? MAXEXTENTS 10
???? MINEXTENS 3);
?
??? 說(shuō)明:
?
??? ① INITIAL:創(chuàng)建段時(shí)分配的第一個(gè)盤(pán)區(qū)大小。默認(rèn)為5個(gè)數(shù)據(jù)塊,最小值2個(gè)數(shù)據(jù)塊(字典管理表空間)或3個(gè)數(shù)據(jù)塊(本地管理表空間),最大值由操作系統(tǒng)指定。注意該參數(shù)不能在ALTER語(yǔ)句中指定。
??? ② NEXT:分配給下一個(gè)增加的盤(pán)區(qū)大小。第二個(gè)盤(pán)區(qū)為NEXT值,再往后NEXT設(shè)置為上一個(gè)NEXT*(1+PCTINCREASE/100)。該參數(shù)默認(rèn)值為5個(gè)數(shù)據(jù)塊,最小值為1個(gè)數(shù)據(jù)塊,最大值由操作系統(tǒng)指定。
??? ③ PCTINCREASE:用于計(jì)算NEXT的值,NEXT*(1+PCTINCREASE/100)。默認(rèn)值為50(%),最小值為0(%),最大值由操作系統(tǒng)指定。
??? ④ MINEXTENTS:創(chuàng)建段時(shí)分配的盤(pán)區(qū)總數(shù)。允許創(chuàng)建時(shí)分配一個(gè)大的空間,即使連續(xù)空間不夠用。默認(rèn)值為1(盤(pán)區(qū)),回滾段為2(盤(pán)區(qū)),默認(rèn)值即最小值,最大值沒(méi)有限制。
??? ⑤?MAXEXTENTS:能夠分配給段的最大盤(pán)區(qū)總數(shù)(包括第一個(gè)),默認(rèn)值取決于數(shù)據(jù)塊大小和操作系統(tǒng)。最小值為MINEXTENTS的最小值,最大值沒(méi)有限制。
??? ⑥ FREELIST GROUPS:數(shù)據(jù)庫(kù)對(duì)象的空閑表組數(shù)。RAC中的實(shí)例數(shù)將每個(gè)實(shí)例映射到一個(gè)空閑組中。默認(rèn)值/最小值為1,最大值為RAC的實(shí)例數(shù)。
??? ⑦ FREELISTS:模式對(duì)象的每個(gè)空閑表組中空閑表的數(shù)目,對(duì)表空間無(wú)效,默認(rèn)值/最小值為1,最大值取決于數(shù)據(jù)塊的大小。
??? ⑧ OPTIMAL:只與回滾段有關(guān)。
??? ⑨ BUFFER_POOL:為模式對(duì)象定義一個(gè)默認(rèn)的緩沖池,對(duì)表空間或回滾段無(wú)效。
?
??? 2、需要設(shè)置存儲(chǔ)參數(shù)的對(duì)象
?
??? ① 表空間中的段
??????? 在創(chuàng)建表空間時(shí)使用STORAGE子句進(jìn)行設(shè)置
??????? 當(dāng)表空間層指定MINEXTENTS參數(shù)時(shí),該表空間中分配的任何盤(pán)區(qū)舍入到一個(gè)最小盤(pán)區(qū)的倍數(shù)
?
??? ② 數(shù)據(jù)段
??????? 在使用表、物化視圖、物化視圖日志的CREATE或ALTER語(yǔ)句中的STORAGE子句,可以為非簇表、物化視圖、物化視圖日志數(shù)據(jù)段配置存儲(chǔ)參數(shù)。
??????? 使用CREATE CLUSTER或ALTER CLUSTER語(yǔ)句中的STORAGE子句,為簇的數(shù)據(jù)段設(shè)置存儲(chǔ)參數(shù),而不是繼承自表或物化視圖。
??????? 分區(qū)表的存儲(chǔ)參數(shù)繼承自表,若表上沒(méi)有指定,則繼承自表空間。
?
??? ③ 索引段
??????? 用CREATE INDEX或ALTER INDEX語(yǔ)句中的STORAGE子句設(shè)置
?
??? ④ LOB、VARRAY、嵌套表
?
??? 3、修改存儲(chǔ)參數(shù)值
?
??? 可以修改表空間的默認(rèn)存儲(chǔ)參數(shù)和單個(gè)段的特定存儲(chǔ)參數(shù)。也可以為表空間重置默認(rèn)參數(shù)。
??? 注:修改后只影響新創(chuàng)建的對(duì)象,或者為段新分配的盤(pán)區(qū)。
?
??? 不能為現(xiàn)有的表、簇、索引、回滾段修改INITIAL、MINEXTENTS參數(shù)。
?
??? 如果一個(gè)段的NEXT參數(shù)修改,則下次增加盤(pán)區(qū)就是新的NEXT,隨后按以前方式增長(zhǎng)。
??? 如果一個(gè)短的NEXT和PCTINCREASE都被修改,則下一個(gè)盤(pán)區(qū)就是新的NEXT,隨后也以新參數(shù)增長(zhǎng)。
?
??? 4、了解存儲(chǔ)參數(shù)生效先后次序
?
??? 對(duì)象的層次越低,存儲(chǔ)參數(shù)的有效性就越高:
?
??? ① ALTER [TABLE|CLUSTER|MATERIALIZED VIEW|MATERILIZED VEW LOG|INDEX|ROLLBACK] SEGMENT
??? ② CREATE [TABLE|CLUSTER|MATERIALIZED VIEW|MATERILIZED VEW LOG|INDEX|ROLLBACK] SEGMENT
??? ③ ALTER TABLESPACE
??? ④ CREATE TABLESPACE
??? ⑤ Oracle默認(rèn)值
?
??? 注:臨時(shí)段的存儲(chǔ)參數(shù)一般都使用相關(guān)的表空間設(shè)置的默認(rèn)存儲(chǔ)參數(shù)
?
??? 5、存儲(chǔ)參數(shù)對(duì)空間分配的影響
?
??? 舉例如下:
??? ... ...
??? STORAGE
??? (INITIAL 100K
???? NEXT 100K
???? MINEXTENTS 2
???? MAXEXTENTS 5
???? PXTINCREASE 50)
?
??? 若DB_BLOCK_SIZE為2K,則其盤(pán)區(qū)的增長(zhǎng)情況如下:
?
??? 盤(pán)區(qū)號(hào)? 盤(pán)區(qū)大小????????????? NEXT取值
??? ------ -------------------? -----------------
??? 1????? 50個(gè)塊或102400字節(jié)??? 50個(gè)塊或102400字節(jié)
??? 2????? 50個(gè)塊或102400字節(jié)??? 75個(gè)塊或153600字節(jié)
??? 3????? 75個(gè)塊或153600字節(jié)??? 113個(gè)塊或231424字節(jié)
??? 4????? 115個(gè)塊或235520字節(jié)?? 170個(gè)塊或348160字節(jié)
??? 5????? 170個(gè)塊或348160字節(jié)?? 無(wú)NEXT,因?yàn)镸AXEXTENTS=5
?
?
三、回收空間
?
??? 在為段分配了空間之后,如果發(fā)現(xiàn)有未使用或過(guò)多分配的空間,可以將其釋放以便使用未時(shí)空的空間來(lái)被其他段使用。
?
??? 1、觀察高水位標(biāo)記
?
??? 使用DBMS_SPACE.UNUSED_SPACE函數(shù)查看一個(gè)段中未使用空間的數(shù)量。
?
??? 注:低于高水位標(biāo)記的空間不能被釋放,即使空間中沒(méi)有數(shù)據(jù)。
??????? 但是如果段是空的,可以使用TRUNCATE ... DROP STORAGE語(yǔ)句釋放空間
?
??? 2、發(fā)布空間回收語(yǔ)句
?
??? ALTER TABLE table DEALLACATE UNUSED KEEP integer;
??? ALTER INDEX index DEALLOCATE UNUSED KEEP integer;
??? ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer;
?
??? 其中KEEP子句是可選的,指定保留不被收回的未使用空間。如果剩下的盤(pán)區(qū)個(gè)數(shù)變得比MINEXTENTS參數(shù)值小,那么MINEXTENTS就會(huì)改變以反應(yīng)新的個(gè)數(shù)。如果初始盤(pán)區(qū)變小,將修改INITIAL參數(shù)值以反應(yīng)初始盤(pán)區(qū)的新大小。
?
??? 若沒(méi)有指定KEEP子句,則所有高于高水位標(biāo)記的未使用空間均被回收。MINEXTENTS和初始盤(pán)區(qū)大小不變。
?
??? 3、回收空間的例子
?
??? ① 一個(gè)表由3個(gè)盤(pán)區(qū)組成,第一個(gè)10K,第二個(gè)20K,第三個(gè)30K。高水位標(biāo)記在第二個(gè)盤(pán)區(qū)的中部,且有40K的未使用空間,
?????? 則使用ALTER TABLE dquon DEALLOCATE UNUSED;語(yǔ)句后的改變?nèi)缦拢?/font>
?????? 所有未使用空間被回收,表dquon只剩下兩個(gè)盤(pán)區(qū),且第二個(gè)盤(pán)區(qū)變成10K。
?
???
?
??? 如果是使用ALTER TABLE dquon DEALLOCATE UNUSED KEEP 10K;語(yǔ)句,則:
??? 盤(pán)區(qū)3被全部收回,但盤(pán)區(qū)2保持20K不變
?
???
?
??? ② 在①的表盤(pán)區(qū)3被回收,且盤(pán)區(qū)2縮減為10K之后,下一個(gè)分配的盤(pán)區(qū)講仍然是30K,而這是我們不希望的。
?????? 所以可以手動(dòng)指定一下下一個(gè)盤(pán)區(qū)的大小:
?????? ALTER TABLE dquon STORAGE (NEXT 20K);
?
??? ③ 如果表dquon有一個(gè)參數(shù)MINEXTENTS為2,則①中的兩次操作都將沒(méi)有變化。
?????? 但是如果MINEXTENTS=3,則在①中的第一個(gè)例子中,語(yǔ)句將沒(méi)有效果。而第二個(gè)例子中,會(huì)產(chǎn)生同樣效果,但MINEXTENTS修改為2。
?