久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

數據庫表空間高水位的知識有哪些

152次閱讀
沒有評論

共計 4752 個字符,預計需要花費 12 分鐘才能閱讀完成。

本篇內容主要講解“數據庫表空間高水位的知識有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“數據庫表空間高水位的知識有哪些”吧!

一、對于手動段空間管理(MSSM)的表空間

高水位標記(HWM)是指這個段空間中已使用和未使用的 block 的分界線,HWM 之上的空間在格式化之前不能被使用。即在 HWM 以上的數據塊均為未格式化的塊,這些未格式化的塊在格式化之前是不能被 insert 數據的。

在數據庫事務中,當請求新的空閑塊并且現有空閑列表中的塊不能滿足要求時,HWM 會向上移動,然后格式化一組數據塊并加入 Free List 提供使用。

在 HWM 之下的數據塊也可能存在空閑的情況,當數據被刪除時,數據塊被釋放重新回到 FreeList,又可以被其它數據變更所用,HWM 通常只能向上增長,不會自動收縮。

HWM 會影響 Oracle 執行全表掃描時的讀取行為,對于全表掃描操作,Oracle 必須讀取 HWM 下的所有數據塊,如果一個數據表由于 DELETE 操作刪除了大部分記錄,但是 HWM 并不會降低,所以再次執行全表掃描時,Oracle 仍然需要讀取對象段中所有的數據塊(也就是 HWM 以下的所有數據塊)

對于通常的對象,我人不太需要關注其 HWM 的影響,但是如果表的刪除操作非常頻繁,表中的在部分 Block 已經為空,那么可能就需要關注其空間性能問題。

二、簡單的估算表中的空塊的數據

  通過 dba_tables 視圖查出表所占用的 blocks 數量

SELECT blocks FROM dba_tables WHERE table_name= 表名 

  通過 rowid 計算出實際表中的數據占用 blocks 數量

  目前 Oracle(8i 以后版本)的 rowid 格式是 OOOOOO.FFF.BBBBBB.RRR 共 18 位,占用 10 個字節,代表 80 位二進數,

  其中 O 代表 對象號,F 代表文件號,B 代表塊號,R 代表行號,這 80 位的方式 為:

  32bit obj# + 10bit rfile# + 22bit block# + 16bit row#

  因此我們通過這樣一個 SQL 就可以大概算出表占用的 block 數量(取 rowid 的前 15 位)

SELECT COUNT(DISTINCT(SUBSTR(ROWID,1,15))) FROM  表名;

  兩步得出來的結果相除就可以得出使用數據塊占用比和空塊的占用比

三、對于自動段空間管理(ASSM)的表空間

對于 ASSM 方式管理的段,在其段頭是會存在兩種高水位標記,分別是 LHWM 和 HHWM,即低高水位和高高水位

由于在 ASSM 管理方式下不存在 Free List,所以 LHWM 和 HHWM 概念被引入用于實現段空間管理,在 ASSM 管理模式下,當一個會話向表中插入數據時,數據庫首先格式化一個位圖塊(而不是像以前那樣格式化一組塊),這個位圖塊代替 Free List 用于跟蹤段中的數據塊的狀態變化,數據庫通過位圖塊去尋找空閑塊并在使用前對其進行格式化。

ASSM 管理方式下的 Segment 的 LHWM 和 HHWM 的特點如下:

  所有在 HHWM 以上的數據塊一定是未格式化的塊

  所有在 LHWM 以下的數據塊一定是格式化的塊

    在 LHWM 和 HHWM 之間的數據塊有可能是格式化的也有可能是未格式化的

  Oracle 在全表掃描一個 Segment 時,會一直掃描到 HHWM 為止

對于使用 ASSM 管理的 Segment,可以通過 Oracle 提供的 DBMS_SPACE 直接計算其空間使用情況

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 )
begin
dbms_output.put_line( rpad(p_label,40, .) ||p_num );
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);
/

我們知道,在 ASSM 下,block 的空間使用分為 free space:0-25%,25-50%,50-75%,70-100%,full 這樣 5 中情況,show_space_assm 會對需要統計的 table 匯總這 5 中類型的 block 的數量。

我們來看 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

這個結果顯示,table HWM1,full 的 block 有 417 個,free space 為 75-100% Block 有 8 個,free space 25-50% Block 有 1 個。當 table HWM 下的 blocks 的狀態大多為 free space 較高的值時,我們考慮來合并 HWM 下的 blocks,將空閑的 block 釋放,降低 table 的 HWM。

四、降低高水位的方法

導出 / 導入與 TRUNCATE 結合

truncate 命令可以降低高水位,但是可能這種方法的場景非常少

可以通過 EXP 導出數據或者使用 CTAS 創建一張香表,然后 Truncate 表,再導入或者 insert 回數據,但是對于不間斷服務的數據表并不合適

RENAME 和 INSERT 結合

對于連續使用的數據表,如果數據是以寫為主的日志類數據,則可以通過 RENAME 將數據表更名,然后按原來的結構重建數據表,此時插入操作可以恢復,這個過程非常迅速,對于數據庫影響較小,然后可以將 RENAME 表中的數據插入回來,這就完成了數據整理,HWM 可以降低,這種方法適用于寫為主的業務類型,不適合增刪改查頻繁的對象。

在線重定義(DBMS_REDEFINITION)

從 Oracle 9I 開始引入了在線重定義特性,通過 DBMS_REDEFINITION 包可以對表進行在線重定義,如修改表字段名稱、增加字段等,當然也可以借用這個包進行空間整理。

在線重定義過程中,Oracle 通過中間的臨時表來記錄中間變化數據,完成重定義后可以將數據整合到重定義表中,數據庫的正常操作可以繼續進行。

Shrink 特性

從 Oracle 10g 開始引入了用于支持在線空間重整,這僦是聯機段空間回收功能(Shrink Database Segments Online)

聯機段收縮公對 ASSM 表空間中的表有效,Shrink 的本質就是對表執行一系列的 DML 操作,刪除表末端的稀疏行,并在表的頂端重新插入。通過這樣的一系列操作,可以填滿表段中的“漏洞”空間,逐步將所有剩余空間留在表的末端,然后 Oracle 可以重置該表的 HWM,釋放空間。由于 Shrink 是針對數據行進行處理的,在表上會獲得行級排他鎖,所以并不會影響全表的 DML 操作,這也是 Online 的意義所在,但是 Shrink 可能會產生大量 Redo,影響歸檔量,在操作時需要考慮。

由于回收段空間需要移動行數據,數據的 rowid 會發生變化,索引會被同時維護,也因此在執行 Shrink 之前,需要設置表的 ENABLE ROW MOVEMENT 屬性。

但需要注意的是,由于段空間重整是通過 DML 操作來完成的,所以會產生額外的 redo,如果數據表非常大,那么產生的 Redo 可能是生產接受的

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 的過程中會影響在線應用,所以這種方法使用較為有限

其它方法

空間的重建始終是一個難題,各種方法都是以一定的性能犧牲為代價的,這就使得很多方法在實際的生產過程中并不可用,所以更好的辦法應該是從應用入手、從規劃入手,從最開始就能夠避免一些可能出現的問題。

在最常采用的方法中,分區是一個常用的手段,涉及大量數據變更的數據表,很多可以通過分區來處理,由于分區表可以針對分區進行諸如 DROP、TRUNCATE 等操作,從而可以很容易地對分區進行維護,進而解決一系列的空間問題。

當然分區并不是萬能的,其適用環境也是有限的,所以真正能夠解決問題的方法還是來自己我們自己,通過對 Oracle 各種技術的認識和了解后,我們才能夠制定出適合我們需要的空間維護手段。

到此,相信大家對“數據庫表空間高水位的知識有哪些”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-20發表,共計4752字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 平乐县| 黄山市| 密云县| 宜章县| 梅河口市| 鹤岗市| 石景山区| 朝阳区| 灵寿县| 桃源县| 石城县| 盐城市| 石棉县| 东至县| 西充县| 富裕县| 连江县| 会同县| 桂东县| 筠连县| 涿州市| 桦川县| 宿松县| 肥城市| 怀化市| 嘉禾县| 高密市| 仙桃市| 垫江县| 潮安县| 宜阳县| 安阳县| 塘沽区| 报价| 渭南市| 南宁市| 通化县| 紫云| 理塘县| 阜宁县| 得荣县|