本篇內(nèi)容主要講解“數(shù)據(jù)庫表空間高水位的知識有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“數(shù)據(jù)庫表空間高水位的知識有哪些”吧!
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供潮安網(wǎng)站建設(shè)、潮安做網(wǎng)站、潮安網(wǎng)站設(shè)計(jì)、潮安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、潮安企業(yè)網(wǎng)站模板建站服務(wù),十年潮安做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
一、對于手動段空間管理(MSSM)的表空間
高水位標(biāo)記(HWM)是指這個段空間中已使用和未使用的block的分界線,HWM之上的空間在格式化之前不能被使用。即在HWM以上的數(shù)據(jù)塊均為未格式化的塊,這些未格式化的塊在格式化之前是不能被 insert數(shù)據(jù)的。
在數(shù)據(jù)庫事務(wù)中,當(dāng)請求新的空閑塊并且現(xiàn)有空閑列表中的塊不能滿足要求時,HWM會向上移動,然后格式化一組數(shù)據(jù)塊并加入Free List提供使用。
在HWM之下的數(shù)據(jù)塊也可能存在空閑的情況,當(dāng)數(shù)據(jù)被刪除時,數(shù)據(jù)塊被釋放重新回到FreeList,又可以被其它數(shù)據(jù)變更所用,HWM通常只能向上增長,不會自動收縮。
HWM會影響Oracle執(zhí)行全表掃描時的讀取行為,對于全表掃描操作,Oracle必須讀取HWM下的所有數(shù)據(jù)塊,如果一個數(shù)據(jù)表由于DELETE操作刪除了大部分記錄,但是HWM并不會降低,所以再次執(zhí)行全表掃描時,Oracle仍然需要讀取對象段中所有的數(shù)據(jù)塊(也就是HWM以下的所有數(shù)據(jù)塊)
對于通常的對象,我人不太需要關(guān)注其HWM的影響,但是如果表的刪除操作非常頻繁,表中的在部分Block已經(jīng)為空,那么可能就需要關(guān)注其空間性能問題。
二、簡單的估算表中的空塊的數(shù)據(jù)
通過dba_tables視圖查出表所占用的blocks數(shù)量
SELECT blocks FROM dba_tables WHERE table_name='表名';
通過rowid計(jì)算出實(shí)際表中的數(shù)據(jù)占用blocks數(shù)量
目前Oracle(8i以后版本)的rowid格式是 OOOOOO.FFF.BBBBBB.RRR共18位,占用10個字節(jié),代表80位二進(jìn)數(shù),
其中 O 代表 對象號,F(xiàn)代表文件號,B代表塊號,R代表行號,這80位的方式 為:
32bit obj# + 10bit rfile# + 22bit block# + 16bit row#
因此我們通過這樣一個SQL就可以大概算出表占用的block數(shù)量(取rowid的前15位)
SELECT COUNT(DISTINCT(SUBSTR(ROWID,1,15))) FROM 表名;
兩步得出來的結(jié)果相除就可以得出使用數(shù)據(jù)塊占用比和空塊的占用比
三、對于自動段空間管理(ASSM)的表空間
對于ASSM方式管理的段,在其段頭是會存在兩種高水位標(biāo)記,分別是LHWM和HHWM,即低高水位和高高水位
由于在ASSM管理方式下不存在Free List ,所以LHWM和HHWM概念被引入用于實(shí)現(xiàn)段空間管理,在ASSM管理模式下,當(dāng)一個會話向表中插入數(shù)據(jù)時,數(shù)據(jù)庫首先格式化一個位圖塊(而不是像以前那樣格式化一組塊),這個位圖塊代替Free List用于跟蹤段中的數(shù)據(jù)塊的狀態(tài)變化,數(shù)據(jù)庫通過位圖塊去尋找空閑塊并在使用前對其進(jìn)行格式化。
ASSM管理方式下的Segment 的LHWM和HHWM的特點(diǎn)如下:
所有在HHWM以上的數(shù)據(jù)塊一定是未格式化的塊
所有在LHWM以下的數(shù)據(jù)塊一定是格式化的塊
在LHWM和HHWM之間的數(shù)據(jù)塊有可能是格式化的也有可能是未格式化的
Oracle在全表掃描一個Segment時,會一直掃描到HHWM為止
對于使用ASSM管理的Segment,可以通過Oracle提供的DBMS_SPACE直接計(jì)算其空間使用情況
create or replace procedure show_space_assm( p_segname in varchar2, p_owner in varchar2 default user, p_type in varchar2 default 'TABLE' ) as l_fs1_bytes number; l_fs2_bytes number; l_fs3_bytes number; l_fs4_bytes number; l_fs1_blocks number; l_fs2_blocks number; l_fs3_blocks number; l_fs4_blocks number; l_full_bytes number; l_full_blocks number; l_unformatted_bytes number; l_unformatted_blocks number; procedure p( p_label in varchar2, p_num in number ) is begin dbms_output.put_line( rpad(p_label,40,'.') ||p_num ); end; begin dbms_space.space_usage( segment_owner => p_owner, segment_name => p_segname, segment_type => p_type, fs1_bytes => l_fs1_bytes, fs1_blocks => l_fs1_blocks, fs2_bytes => l_fs2_bytes, fs2_blocks => l_fs2_blocks, fs3_bytes => l_fs3_bytes, fs3_blocks => l_fs3_blocks, fs4_bytes => l_fs4_bytes, fs4_blocks => l_fs4_blocks, full_bytes => l_full_bytes, full_blocks => l_full_blocks, unformatted_blocks => l_unformatted_blocks, unformatted_bytes => l_unformatted_bytes); p('free space 0-25% Blocks:',l_fs1_blocks); p('free space 25-50% Blocks:',l_fs2_blocks); p('free space 50-75% Blocks:',l_fs3_blocks); p('free space 75-100% Blocks:',l_fs4_blocks); p('Full Blocks:',l_full_blocks); p('Unformatted blocks:',l_unformatted_blocks); end; /
我們知道,在ASSM下,block的空間使用分為free space: 0-25%,25-50%,50-75%,70-100%,full 這樣5中情況,show_space_assm會對需要統(tǒng)計(jì)的table匯總這5中類型的block的數(shù)量。
我們來看table HWM1的空間使用情況:
SQL> exec show_space_assm('HWM1','DLINGER');
free space 0-25% Blocks:.................0
free space 25-50% Blocks:...............1
free space 50-75% Blocks:...............0
free space 75-100% Blocks:..............8
Full Blocks:.....................................417
Unformatted blocks:.........................0
這個結(jié)果顯示,table HWM1,full的block有417個,free space 為75-100% Block有8個,free space 25-50% Block有1個。當(dāng)table HWM下的blocks的狀態(tài)大多為free space較高的值時,我們考慮來合并HWM下的blocks,將空閑的block釋放,降低table的HWM。
四、降低高水位的方法
導(dǎo)出/導(dǎo)入與TRUNCATE結(jié)合
truncate命令可以降低高水位,但是可能這種方法的場景非常少
可以通過EXP導(dǎo)出數(shù)據(jù)或者使用CTAS創(chuàng)建一張香表,然后Truncate表,再導(dǎo)入或者insert回?cái)?shù)據(jù),但是對于不間斷服務(wù)的數(shù)據(jù)表并不合適
RENAME和INSERT結(jié)合
對于連續(xù)使用的數(shù)據(jù)表,如果數(shù)據(jù)是以寫為主的日志類數(shù)據(jù),則可以通過RENAME將數(shù)據(jù)表更名,然后按原來的結(jié)構(gòu)重建數(shù)據(jù)表,此時插入操作可以恢復(fù),這個過程非常迅速,對于數(shù)據(jù)庫影響較小,然后可以將RENAME表中的數(shù)據(jù)插入回來,這就完成了數(shù)據(jù)整理,HWM可以降低,這種方法適用于寫為主的業(yè)務(wù)類型,不適合增刪改查頻繁的對象。
在線重定義(DBMS_REDEFINITION)
從Oracle 9I開始引入了在線重定義特性,通過DBMS_REDEFINITION包可以對表進(jìn)行在線重定義,如修改表字段名稱、增加字段等,當(dāng)然也可以借用這個包進(jìn)行空間整理。
在線重定義過程中,Oracle通過中間的臨時表來記錄中間變化數(shù)據(jù),完成重定義后可以將數(shù)據(jù)整合到重定義表中,數(shù)據(jù)庫的正常操作可以繼續(xù)進(jìn)行。
Shrink特性
從Oracle 10g開始引入了用于支持在線空間重整,這僦是聯(lián)機(jī)段空間回收功能 (Shrink Database Segments Online)
聯(lián)機(jī)段收縮公對ASSM表空間中的表有效,Shrink的本質(zhì)就是對表執(zhí)行一系列的DML操作,刪除表末端的稀疏行,并在表的頂端重新插入。通過這樣的一系列操作,可以填滿表段中的“漏洞”空間,逐步將所有剩余空間留在表的末端,然后Oracle可以重置該表的HWM,釋放空間。由于Shrink是針對數(shù)據(jù)行進(jìn)行處理的 ,在表上會獲得行級排他鎖,所以并不會影響全表的DML操作,這也是Online的意義所在,但是Shrink可能會產(chǎn)生大量Redo,影響歸檔量,在操作時需要考慮。
由于回收段空間需要移動行數(shù)據(jù),數(shù)據(jù)的rowid會發(fā)生變化,索引會被同時維護(hù),也因此在執(zhí)行Shrink之前,需要設(shè)置表的ENABLE ROW MOVEMENT屬性。
但需要注意的是,由于段空間重整是通過DML操作來完成的,所以會產(chǎn)生額外的redo,如果數(shù)據(jù)表非常大,那么產(chǎn)生的Redo可能是生產(chǎn)接受的
alter table 表名 enable row movement;
alter table 表名 shrink space;
不支持Shrink的表:
IOT mapping tables
Tables with rowid based materialized views
Tables with function-based indexes
SECUREFILE LOBs
Compressed tables
Move對象
通過Move操作移動對象,可以降低HWM,但是Move之后,索引需要重建,而且在Move的過程中會影響在線應(yīng)用,所以這種方法使用較為有限
其它方法
空間的重建始終是一個難題,各種方法都是以一定的性能犧牲為代價(jià)的,這就使得很多方法在實(shí)際的生產(chǎn)過程中并不可用,所以更好的辦法應(yīng)該是從應(yīng)用入手、從規(guī)劃入手,從最開始就能夠避免一些可能出現(xiàn)的問題。
在最常采用的方法中,分區(qū)是一個常用的手段,涉及大量數(shù)據(jù)變更的數(shù)據(jù)表,很多可以通過分區(qū)來處理,由于分區(qū)表可以針對分區(qū)進(jìn)行諸如DROP、TRUNCATE等操作,從而可以很容易地對分區(qū)進(jìn)行維護(hù),進(jìn)而解決一系列的空間問題。
當(dāng)然分區(qū)并不是萬能的,其適用環(huán)境也是有限的,所以真正能夠解決問題的方法還是來自己我們自己,通過對Oracle各種技術(shù)的認(rèn)識和了解后,我們才能夠制定出適合我們需要的空間維護(hù)手段。
到此,相信大家對“數(shù)據(jù)庫表空間高水位的知識有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
網(wǎng)頁標(biāo)題:數(shù)據(jù)庫表空間高水位的知識有哪些
分享路徑:http://jinyejixie.com/article10/gdhodo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、定制開發(fā)、網(wǎng)站設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)