中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

實例演示oracle數據塊狀態視圖v$bh的用法一 獲取oracle對象所占用的數據塊

發布時間:2020-08-08 14:21:00 來源:ITPUB博客 閱讀:183 作者:Davis_itpub 欄目:建站服務器

1,創建一個測試表,test,并且插入10000行數據;
    SQL>  create table test (id int);

    SQL> begin
      2  for i in 1..10000 loop
      3  insert into test values(i)
      4  end loop;
      5  end;
      6  /

    SQL> commit


2
,創建一個存儲過程SHOW_SPACE
   

文件:

show_spaceprocedure.rar

大小:

0KB

下載:

下載

create or replace procedure show_space

       ( p_segname in varchar2,

  p_owner   in varchar2 default user,

  p_type    in varchar2 default 'TABLE',

  p_partition in varchar2 default NULL )

as

    l_total_blocks              number;

    l_total_bytes               number;

    l_unused_blocks             number;

    l_unused_bytes              number;

    l_LastUsedExtFileId         number;

    l_LastUsedExtBlockId        number;

    l_last_used_block           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.unused_space

    ( segment_owner     => p_owner,

      segment_name      => p_segname,

      segment_type      => p_type,

      partition_name    => p_partition,

      total_blocks      => l_total_blocks,

      total_bytes       => l_total_bytes,

      unused_blocks     => l_unused_blocks,

      unused_bytes      => l_unused_bytes,

      last_used_extent_file_id => l_LastUsedExtFileId,

      last_used_extent_block_id => l_LastUsedExtBlockId,

      last_used_block => l_last_used_block );

    p( 'Total Blocks', l_total_blocks );

    p( 'Total Bytes', l_total_bytes );

    p( 'Unused Blocks', l_unused_blocks );

    p( 'Unused Bytes', l_unused_bytes );

    p( 'Last Used Ext FileId', l_LastUsedExtFileId );

    p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );

    p( 'Last Used Block', l_last_used_block );

end;

/

3,檢查表test的空間使用情況:
    SQL> exec show_space('TEST');
    Total Blocks............................24
    Total Bytes.............................196608
    Unused Blocks...........................3
    Unused Bytes............................24576
    Last Used Ext FileId....................1
    Last Used Ext BlockId...................62177
    Last Used Block.........................5
   
   
由上可知,該表test共占用了24個數據塊,196608字節,文件ID1

4
獲得表test在數據塊中的分布情況:
  SQL> select f,b from (
  2  select dbms_rowid.rowid_relative_fno(rowid) f,
  3         dbms_rowid.rowid_block_number(rowid) b
  4  from test) group by f,b order by b;

         F          B
---------- ----------
         1      62162
         1      62163
         1      62164
         1      62165
         1      62166
         1      62167
         1      62168
         1      62169
         1      62170
         1      62171
         1      62172
         1      62173
         1      62174
         1      62175
         1      62176
         1      62177

16 rows selected.
   
由此可見,表test中的數據共占用了16個數據塊,但是前面第三步中,發現該表占用了24個數據塊。這是正常的,因為oracle本身會使用8個數據塊來記錄段頭、位圖塊等額外的信息。我們現在只需要了解到,表test共占用了24個數據塊,其中16個是數據,8個是表信息。

5
,檢查x$bhv$bh的更新:
  SQL> select file#,dbablk,tch from x$bh where bj=
  2  (select data_object_id from dba_objects
  3  where wner='SYS'  and object_name='TEST')
  4  order by dbablk;

     FILE#     DBABLK        TCH
---------- ---------- ----------
         1      62161          6
         1      62162          3
         1      62163          3
         1      62164          3
         1      62165          3
         1      62166          3
         1      62167          3
         1      62168          3
         1      62169          3
         1      62170          3
         1      62171          3
         1      62172          3
         1      62173          3
         1      62174          3
         1      62175          3
         1      62176          3
         1      62177          3
         1      62178          3
         1      62179          3
         1      62180          3
         1      62181          3

21 rows selected.

  SQL> select file#,block#,status from v$bh where bjd=
  2  (select data_object_id from dba_objects
  3  where wner='SYS'  and object_name='TEST')
  4  order by block#;

     FILE#     BLOCK# STATUS
---------- ---------- -------
         1      62161 xcur
         1      62162 xcur
         1      62163 xcur
         1      62164 xcur
         1      62165 xcur
         1      62166 xcur
         1      62167 xcur
         1      62168 xcur
         1      62169 xcur
         1      62170 xcur
         1      62171 xcur
         1      62172 xcur
         1      62173 xcur
         1      62174 xcur
         1      62175 xcur
         1      62176 xcur
         1      62177 xcur
         1      62178 xcur
         1      62179 xcur
         1      62180 xcur
         1      62181 xcur

21 rows selected.

   
這里可以看到,在v$bhx$bh中得到的數據塊,是從621616218121條記錄,但是在第四步中,我們知道數據是占用了621626217716個數據庫,這里,62161數據塊里面存放的是段頭信息,可以通過如下命令進行驗證:
  SQL> select header_file,header_block from dba_segments
  2  where wner='SYS' and segment_name='TEST';

    HEADER_FILE HEADER_BLOCK
    ----------- ------------
          1        62161

   
v$bh視圖中,我們可以看到這21個數據塊都是xcur狀態,表示這些數據塊都是排斥狀態,正在被使用,該字段還有其他的類型,請參見數據塊的狀態類型

oracle緩沖塊(data block)狀態類型

    oracle的緩沖塊的管理機制一直沒有正式的發布過,因此許多有經驗的oracle工程師都是通過經驗或者一下oracle文檔中的注釋來推斷oracle的緩沖塊的管理機制的。

   
事實上,oralce使用v$bh視圖來記錄與數據緩沖(data buffer)相關的信息,它詳細記錄了數據緩沖中每一個數據塊(data block)的狀態信息。

   
v$bh視圖中的status字段,記錄了數據塊的狀態,在非OPS、非RAC這樣的集群環境中,數據塊的狀態會是下列幾種之一:xcurcrreadfree,用戶可以通過如下命令得到數據庫的狀態信息:
    SQL> select unique status from v$bh;

   
其狀態的意義分別是:
    xcur
:(exclusive current)的意思,表示該數據塊處于排外模式;
    cr
:表示該數據塊是一個克隆(clone)的數據庫,可以執行共享的只讀操作;
    free
:表示這是一個限制的數據塊,oracle現在沒有使用它;
    read
:表示該數據塊正在從磁盤讀取數據;
    write
:表示數據庫正在往磁盤寫入數據;

   
在數據庫恢復過程中,該字段還有另外兩個描述:mrecirec
    mrec
:(media recovery)表示數據塊處于介質恢復模式;
    irec
:(instance recovery)表示數據塊處于實例恢復模式;

   
RAC環境中,數據塊還有另外一種模式:
    scur
shared current),表示該數據庫正在和其他實例共享數據。
   

 


6
,清空數據緩存:
    SQL> alter system flush buffer_cache;
Oracle9i里,Oracle提供了一個內部事件,用以強制刷新Buffer Cache,其語法為:

alter session set events 'immediate trace name flush_cache level 1';

或者:

alter session set events = 'immediate trace name flush_cache';

類似的也可以使用alter system系統級設置:

alter system set events = 'immediate trace name flush_cache';

Oracle10g中,Oracle提供一個新的特性,可以通過如下命令刷新Buffer Cache:

alter system flush buffer_cache;

 


7
,重新檢查v$bhx$bh的內容:
  SQL> select file#,dbablk,tch from x$bh where bj=
  2  (select data_object_id from dba_objects
  3  where wner='SYS'  and object_name='TEST')
  4  order by dbablk;

     FILE#     DBABLK        TCH
---------- ---------- ----------
         1      62161          0
         1      62162          0
         1      62163          0
         1      62164          0
         1      62165          0
         1      62166          0
         1      62167          0
         1      62168          0
         1      62169          0
         1      62170          0
         1      62171          0
         1      62172          0
         1      62173          0
         1      62174          0
         1      62175          0
         1      62176          0
         1      62177          0
         1      62178          0
         1      62179          0
         1      62180          0
         1      62181          0

21 rows selected.

    SQL> select file#,block#,status from v$bh where bjd=
  2  (select data_object_id from dba_objects
  3  where wner='SYS'  and object_name='TEST')
  4  order by block#;

     FILE#     BLOCK# STATUS
---------- ---------- -------
         1      62161 free
         1      62162 free
         1      62163 free
         1      62164 free
         1      62165 free
         1      62166 free
         1      62167 free
         1      62168 free
         1      62169 free
         1      62170 free
         1      62171 free
         1      62172 free
         1      62173 free
         1      62174 free
         1      62175 free
         1      62176 free
         1      62177 free
         1      62178 free
         1      62179 free
         1      62180 free
         1      62181 free

21 rows selected.

   
這時候我們可以看到,x$bh中的tch字段,已經由原來的3變成了0,同時v$bh視圖的數據塊狀態也變成了free,但是記錄的數據塊并沒有發生變化,還是在62161~62181這些數據塊中,這就是說,雖然數據已經被寫到了磁盤中,但是數據庫記錄的指針并沒有清空,僅僅是其狀態發生了改變。<SPAN

向AI問一下細節

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

AI

大悟县| 孟连| 大姚县| 库尔勒市| 合川市| 泸西县| 浏阳市| 富平县| 腾冲县| 巴马| 民和| 和田市| 临漳县| 安西县| 宣化县| 荣昌县| 宁明县| 天门市| 陵水| 潢川县| 康保县| 天等县| 东乌珠穆沁旗| 横山县| 乌拉特中旗| 长顺县| 齐齐哈尔市| 延吉市| 且末县| 高台县| 昌图县| 浦江县| 滕州市| 阜城县| 灵寿县| 崇仁县| 招远市| 靖宇县| 同德县| 沙洋县| 荆门市|