oracle原理 Oracle高水位線

2021-10-01 12:35:04 字數 2307 閱讀 7508

oracle高水位線的概念

oracle裡面的物件放到儲存級別都稱為segment(段),比如表段,索引段,回滾段等,這些知識segment的邏輯描述。下面就拿錶段為例解釋下。

在create table的時候可以指定分配給table的初始空間的大小,一般是都少個extent(區間),extent就是多個連續的block。但是我在表中插入資料是個一點點變化的過程。比如我建了乙個表,初始分配了8個extents,每個extents由8個block組成,則就相當於給這個表分配了8*8個blocks。再加入我要插入的資料一行的長度為乙個塊大小,則我每插入一行就需要使用乙個block。

高水位就是用來標明我以往使用過的塊數的最高位。

剛開始我沒有插入資料的時候,高水位就在0塊的位置,當我插入1行資料(占用乙個塊),則高水位就上公升1,指向1塊的位置。就這樣,在不斷的插入資料的過程中,高水位一直在增加,用來標示這個表曾經一共用過的塊數。

但是,高水位有個這樣的問題,當我刪除資料的時候,高水位線是不會自動降的。

而對於全表掃瞄,系統要掃瞄多少個塊,不是為這個表分配了多少塊,而是高水位線以下的所有資料塊。

所以,我原來有個表,首先插入了100行的資料,高水位線到了100的位置,後來我又刪了99條資料,只剩了乙個資料塊有用,但是高水位線依然在100的位置。當我要全表掃瞄的時候,仍然會把高水位下的100個資料庫全部讀一遍才能返回資料。而實際100個資料塊中只有乙個是有用的。

如何檢視表的高水位線

首先需要蒐集表的統計資訊

exec dbms_stats.gather_table_stats(ownname => 'cwcs',tabname => 'gl_freevalue',cascade => true,estimate_percent => 100,method_opt => 'for all indexed column size auto')

然後檢視dba_tables即可

select blocks,

empty_blocks

from dba_tables

where table_name = 'tmp_wjf'

其中blocks+empty_blocks就是分配給表的總塊數,blocks就是高水位線。

如何檢視表實際使用的資料塊數

使用以下sql

selectcount(distinct dbms_rowid.rowid_block_number(rowid)||dbms_rowid.rowid_relative_fno(rowid))  zs

from tmp_wjf;

如果實際用的塊數比高水位線低很多,則調整高水位可顯著改善全表掃瞄效率。

如何降低高水位。

表收縮首先啟用行遷移,再執行表收縮

altertable tmp_wjf enablemovement;

altertable tmp_wjf shrinkspace;

表收縮的過程大致猜想如下:oracle以行為單位,從表的最後一行開始,然後開始掃瞄表,發現表前面的資料庫有空間空間時,就將這最後一行插入到新的位置,然後刪除最後一行的資料,以此迭代。

所以,在shrink的過程中,只有部分行的rowid會發生改變,且表所佔的塊區域不會改變。

而且在shrink的過程中,oracle會自動維護表相關的索引,所以,若表上索引比較大,則在shrink過程中索引的維護費用也比較大。

其中altertable tmp_wjf enablemovement;可能會造成表相關的檢視、儲存過程等失效。索引最好在shrink之後執行下utlrp.sql編譯下無效物件。

shrink過程分兩個過程

資料重組過程,這個過程只會在需要移動的行上加排他鎖。因此對業務影響較小。因為涉及到rowid的變更,需要enable movement和禁用基於rowid的trigger。

降低hwm過程,這個過程會在全表上加排他鎖,所以會阻塞所有關於這個表的dml操作,所以,對業務繁忙的系統還是會造成比較大的影響。

可以使用altertable tmp_wjf shrinkspace compat;只進行資料重組過程,等業務閒了再altertable tmp_wjf shrinkspace降低高水位。

表重建altertable tmp_wjf move;

此種方式,在表空間內,至少有兩倍該錶所佔空間的空間才能實施重建。而且該方式不會減少預先為表分配的資料塊總數。

對於move操作,會在一塊新的區域內拷貝原表的資料,所以,move操作後,表所佔的區域也發生了改變,所有行的rowid也發生了改變。

move操作並不會同步維護索引等相關物件,因此,在move完之後要對索引進行rebuild。

在整個move操作中,會對錶加上排他鎖,所有的dml操作將會被阻塞,只能進行select。

高可用測試oracle

oracle環境配置 1.設定兩台節點機器oracle的 listener.ora配置檔案 2.使用第三台機器訪問主節點的oracle,配置第三台機器oracle配置檔案tnsnames.ora 使用虛ip訪問第三台機器 指令碼思路 dos中呼叫sqlplus執行sql檔案,sql檔案 包含對資料庫...

Oracle 高可用概述

1.你如何理解高可用的概念?所謂的高可用ha就是當你的系統中的某個節點異常損壞了,系統還是可用狀態,還可以對外提供服務,不會因為你的節點丟失而整體癱瘓。2.列出你知道的oracle高可用產品,並作一些功能和應用場景上的說明。rac 基於例項級的高可用產品 dg 基於儲存級別的高可用產品 gg 基於異...

Oracle 高可用概述

1.你如何理解高可用的概念?所謂的高可用ha就是當你的系統中的某個節點異常損壞了,系統還是可用狀態,還可以對外提供服務,不會因為你的節點丟失而整體癱瘓。2.列出你知道的oracle高可用產品,並作一些功能和應用場景上的說明。rac 基於例項級的高可用產品 dg 基於儲存級別的高可用產品 gg 基於異...