1. <var id="fe6gj"></var>

    <rp id="fe6gj"><nav id="fe6gj"></nav></rp>

    <noframes id="fe6gj"><cite id="fe6gj"></cite>

    <ins id="fe6gj"><button id="fe6gj"><p id="fe6gj"></p></button></ins>
    1. <tt id="fe6gj"><i id="fe6gj"><sub id="fe6gj"></sub></i></tt>
        始創于2000年 股票代碼:831685
        咨詢熱線:0371-60135900 注冊有禮 登錄
        • 掛牌上市企業
        • 60秒人工響應
        • 99.99%連通率
        • 7*24h人工
        • 故障100倍補償
        您的位置: 網站首頁 > 幫助中心>文章內容

        Oracle的rowid和rdba庖丁解牛

        發布時間:  2012/8/15 17:47:32

        Oracle 8以下ROWID組成(也叫受限Rowid)為:FFFF.BBBBBBBB.RRRR,占用6個字節(10bit file#+22bit+16bit),但是,為了擴充的需要,如數據文件的擴充,現在的Rowid改為:OOOOOOFFFBBBBBBRRR,占用10個字節(32bit+10bit rfile#+22bit+16bit)。其中,O是對象ID,F是文件ID,B是塊ID,R是行ID。由于rowid的組成從file#變成了rfile#,所以數據文件數的限制也從整個庫不能超過1023個變成了每個表空間不能超過1023個數據文件。
        -
         

        注意:這里的O,代表的是data_object_id,是與段物理存儲位置相關的一個信息,因為一個段對象只可能在一個表空間上,data_object_id能唯一確認ts#,而data_object_id + rfile#就能最終定位到該rowid在那個確定的物理數據文件。

        如果我們查詢一個表的ROWID,就可以獲得object的信息,文件信息,塊信息與行信息等等,如根據其中塊的信息,可以知道該表確切占用了多少個塊,每行在哪個塊上,哪個數據文件上。

        我們在select數據時候,在不指定排序字段時, Oracle是按rowid升序取數據的。如

        SQL> select t.id,rowid from skate.tab2 t;

                ID ROWID

        ---------- ------------------

           1067511 AAAO1lAAEAAAHKkAAA

           1067513 AAAO1lAAEAAAHKkAAB

           1067515 AAAO1lAAEAAAHKkAAC

           1067517 AAAO1lAAEAAAHKkAAD

           1067519 AAAO1lAAEAAAHKkAAE

           1067523 AAAO1lAAEAAAHKkAAG

           1067525 AAAO1lAAEAAAHKkAAH

           1067527 AAAO1lAAEAAAHKkAAI

        8 rows selected

        SQL>

        可以從上面的顯示數據看到,是按rowid降序排列。我們拿rowid “AAAO1lAAEAAAHKkAAA”來說明

        Data Object number =AAAO1l

        File id                  =AAE    

        Block id              =AAAHKk

        Row        =AAA

        Rowid是64進制的,可以通過進制轉化工具來查看(http://www.2u3.cn/Conversion/jinzhi/

         

         A-Z <==> 0 - 25 (26)
        a-z <==> 26 - 51 (26)
        0-9 <==> 52 - 61 (10)
        +/ <==> 62 - 63 (2)

         

         拿其中的Data Object number= AAAO1l為例子,

         

        l是64進制中的37,位置為0

        37 * (64 ^ 0) = 37

        1是64進制中的53,位置為1

        53 * (64 ^ 1) = 3392

        O是64進制中的 14,位置為2

        14*(64^2)=57344

        A是64進制中的 0

        所以

        A * (64 ^ 3) = 0

        A * (64 ^ 4) = 0

        A * (64 ^ 5) = 0

        則有AAAO1l= 0 + 0 + 0 + 57344+ 3392 + 37 = 60773,表示該行存在的對象,對應的對象號為60773。

         

        手工算還是比較麻煩的,Oracle為此提供相應的函數dbms_rowid來實現

        SQL> select dbms_rowid.rowid_object('AAAO1lAAEAAAHKkAAA') data_object_id#,

          2         dbms_rowid.rowid_relative_fno('AAAO1lAAEAAAHKkAAA') rfile#,

          3         dbms_rowid.rowid_block_number('AAAO1lAAEAAAHKkAAA') block#,

          4         dbms_rowid.rowid_row_number('AAAO1lAAEAAAHKkAAA') row# from dual;

        DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW#

        --------------- ---------- ---------- ----------

                  60773          4      29348          0

         

        可以通過包的說明或者Oracle官方手冊了解更多,例如:

        SQL> desc dbms_rowid

        Element                Type     

        ---------------------- ---------

        ROWID_TYPE_RESTRICTED  CONSTANT 

        ROWID_TYPE_EXTENDED    CONSTANT 

        ROWID_IS_VALID         CONSTANT 

        ROWID_IS_INVALID       CONSTANT 

        ROWID_OBJECT_UNDEFINED CONSTANT 

        ROWID_CONVERT_INTERNAL CONSTANT 

        ROWID_CONVERT_EXTERNAL CONSTANT 

        ROWID_INVALID          EXCEPTION

        ROWID_BAD_BLOCK        EXCEPTION

        ROWID_CREATE           FUNCTION 

        ROWID_INFO             PROCEDURE

        ROWID_TYPE             FUNCTION 

        ROWID_OBJECT           FUNCTION 

        ROWID_RELATIVE_FNO     FUNCTION 

        ROWID_BLOCK_NUMBER     FUNCTION 

        ROWID_ROW_NUMBER       FUNCTION 

        ROWID_TO_ABSOLUTE_FNO  FUNCTION 

        ROWID_TO_EXTENDED      FUNCTION 

        ROWID_TO_RESTRICTED    FUNCTION 

        ROWID_VERIFY           FUNCTION 

         

        SQL> desc dbms_rowid.rowid_info

        Parameter     Type     Mode Default?

        ------------- -------- ---- --------

        ROWID_IN      ROWID    IN           

        ROWID_TYPE    NUMBER   OUT          

        OBJECT_NUMBER NUMBER   OUT          

        RELATIVE_FNO  NUMBER   OUT          

        BLOCK_NUMBER  NUMBER   OUT          

        ROW_NUMBER    NUMBER   OUT          

        TS_TYPE_IN    VARCHAR2 IN   Y  

        如果明白了以上ROWID的含義,那么就很容易理解塊的地址rdba了,也就是ROWID中的FFFBBBBBB部分,10bit rfile#+22bit,如我們分析一個塊地址:

         rdba: 0x010072a4

        把0x010072a4轉化為10進制16806564

        SQL>   select dbms_utility.data_block_address_file(16806564) "file",

          2           dbms_utility.data_block_address_block(16806564) "block"

          3    from dual;

         

              file      block

        ---------- ----------

                 4      29348

         

        SQL>

        現在通過塊的dba知道了file和block,那怎樣確認我們推到的正確呢? 這個塊地址是dump文件的內容,我們可以去dump文件核對下

        Start dump data blocks tsn: 4 file#: 4 minblk 29348 maxblk 29348

        buffer tsn: 4 rdba: 0x010072a4 (4/29348)

        scn: 0x0000.00e66a1e seq: 0x02 flg: 0x06 tail: 0x6a1e0602

        frmt: 0x02 chkval: 0x4590 type: 0x06=trans data

        Hex dump of block: st=0, typ_found=1

        結果我們推導的和dump的內容是一樣的,不過這里得到的4是rfile#,相對文件號,而相對文件號是不能超過1023,所以,如果你想根據這個地址來dump數據文件塊的話,最好還是核對一下v$datafile:

        select file# from v$datafile where rfile# = 4 and ts# = <:dbfile_in_ts>

        表空間的ts#可以通過如下sql得到:

          select ta.tablespace_name, da.TS#
            from dba_tablespaces ta, dba_data_files df, v$datafile da
           where ta.tablespace_name = df.tablespace_name
             and da.NAME = df.file_name

         例如:

        SQL> select file# from v$datafile where rfile# = 4 and ts# = 4;

            FILE#

        ----------

                 4

        SQL>

         

        如果數據文件數大于1023個,這里file# 就不是4了,應該是個絕對文件號了,這就是file#和rfile#的區別。如果dump數據塊,要用絕對文件號的,例如:

        Alter system dump  datafile 4 block 29348;

        也可以通過dba_segments,如

        SQL>  select header_file,header_block from dba_segments where owner='SKATE' and segment_name='TAB2';

        HEADER_FILE HEADER_BLOCK

        ----------- ------------

                  4        29347

        這里段頭占有一個block,后面存儲的就是數據,所以存儲數據的塊,應該是29348

        -----end-----


        本文出自:億恩科技【www.endtimedelusion.com】

        服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

      1. 您可能在找
      2. 億恩北京公司:
      3. 經營性ICP/ISP證:京B2-20150015
      4. 億恩鄭州公司:
      5. 經營性ICP/ISP/IDC證:豫B1.B2-20060070
      6. 億恩南昌公司:
      7. 經營性ICP/ISP證:贛B2-20080012
      8. 服務器/云主機 24小時售后服務電話:0371-60135900
      9. 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
      10. 專注服務器托管17年
        掃掃關注-微信公眾號
        0371-60135900
        Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區翠竹街1號總部企業基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網安備41019702002023號
          0
         
         
         
         

        0371-60135900
        7*24小時客服服務熱線

         
         
        av不卡不卡在线观看_最近2018年中文字幕_亚洲欧美一区二区三区_一级A爱做片免费观看国产_日韩在线中文天天更新_伊人中文无码在线