溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數(shù)據(jù)庫表空間高水位的知識有哪些

發(fā)布時間:2021-11-11 11:34:39 來源:億速云 閱讀:628 作者:iii 欄目:關系型數(shù)據(jù)庫

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

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

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

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

  • 在HWM之下的數(shù)據(jù)塊也可能存在空閑的情況,當數(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ù)塊)

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

二、簡單的估算表中的空塊的數(shù)據(jù)

     通過dba_tables視圖查出表所占用的blocks數(shù)量

SELECT blocks FROM dba_tables WHERE table_name='表名';

     通過rowid計算出實際表中的數(shù)據(jù)占用blocks數(shù)量

     目前Oracle(8i以后版本)的rowid格式是 OOOOOO.FFF.BBBBBB.RRR共18位,占用10個字節(jié),代表80位二進數(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 表名;

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

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

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

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

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

       所有在HHWM以上的數(shù)據(jù)塊一定是未格式化的塊

       所有在LHWM以下的數(shù)據(jù)塊一定是格式化的塊

       在LHWM和HHWM之間的數(shù)據(jù)塊有可能是格式化的也有可能是未格式化的

        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 )
    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)計的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

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

四、降低高水位的方法

  • 導出/導入與TRUNCATE結合

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

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

  • RENAME和INSERT結合

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

  • 在線重定義(DBMS_REDEFINITION)

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

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

  • Shrink特性

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

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

    由于回收段空間需要移動行數(shù)據(jù),數(shù)據(jù)的rowid會發(fā)生變化,索引會被同時維護,也因此在執(zhí)行Shrink之前,需要設置表的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的過程中會影響在線應用,所以這種方法使用較為有限

  • 其它方法

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

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

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

到此,相信大家對“數(shù)據(jù)庫表空間高水位的知識有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI