欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Oracle rowid 詳解 (轉)

討論的是關(guān)于oracle從8i開(kāi)始引進(jìn)object的概念后的rowid,即擴展(extended)的rowid:

1.       rowid的介紹

先對rowid有個(gè)感官認識:

SQL> select ROWID from Bruce_test where rownum<2;

ROWID 
------------------ ---------- 
AAABnlAAFAAAAAPAAA 
ROWID的格式如下:

數據對象編號        文件編號        塊編號           行編號
OOOOOO             FFF                BBBBBB RRR

我們可以看出,從上面的rowid可以得知:
AAABnl 是數據對象編號
AAF是相關(guān)文件編號
AAAAAP是塊編號
AAA 是行編號

怎么依據這些編號得到具體的十進(jìn)制的編碼值呢,這是經(jīng)常遇到的問(wèn)題。這里需要明白rowid的是基于64位編碼的18個(gè)字符顯示(數據對象編號(6) +文件編號(3) +塊編號(6)+       行編號(3)=18位),其中
A-Z <==> 0 - 25 (26) 
a-z <==> 26 - 51 (26) 
0-9 <==> 52 - 61 (10) 
+/ <==> 62 - 63 (2)

共64位,明白這個(gè)后,就可以計算出10進(jìn)制的編碼值,計算公式如下:
d * (b ^ p)
其中:b就是基數,這里就是64,p就是從右到左,已0開(kāi)始的位置數
比如:上面的例子
文件號AAF,具體的計算應該是:
5*(64^0)=5;
0*(64^1)=0;
0*(64^2)=0;
文件號就是0+0+5=5
剛才提到的是rowid的顯示方式:基于64位編碼的18個(gè)字符顯示,其實(shí)rowid的存儲方式是:10 個(gè)字節即80位存儲,其中數據對象編號需要32 位,相關(guān)文件編號需要10 位,塊編號需要22,位行編號需要16 位,由此,我們可以得出:
32bit的object number,每個(gè)數據庫最多有4G個(gè)對象
10bit的file number,每個(gè)對象最多有1022個(gè)文件(2個(gè)文件預留)
22bit的block number,每個(gè)文件最多有4M個(gè)BLOCK
16bit的row number,每個(gè)BLOCK最多有64K個(gè)ROWS

2.       rowid相關(guān)的有用的sql

最簡(jiǎn)單的基于rowid的顯示方式得到的響應的64位編碼對應值的sql:
select rowid ,
substr(rowid,1,6) "OBJECT",
substr(rowid,7,3) "FILE",
substr(rowid,10,6) "BLOCK",
substr(rowid,16,3) "ROW"
from TableName;

OWID              OBJECT       FILE   BLOCK        ROW
------------------ ------------ ------ ------------ ------
AAABc4AADAAAGLUAAA AAABc4       AAD    AAAGLU       AAA
AAABc4AADAAAGLUAAB AAABc4       AAD    AAAGLU       AAB
AAABc4AADAAAGLUAAC AAABc4       AAD    AAAGLU       AAC
AAABc4AADAAAGLUAAD AAABc4       AAD    AAAGLU       AAD
AAABc4AADAAAGLUAAE AAABc4       AAD    AAAGLU       AAE

通過(guò)dbms_rowid這個(gè)包,可以直接的得到具體的rowid包含的信息:
select dbms_rowid.rowid_object(rowid) object_id, dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id ,dbms_rowid.rowid_row_number(rowid) num from bruce_t where rownum<5;

OBJECT_ID    FILE_ID   BLOCK_ID        NUM
---------- ---------- ---------- ----------
      5944          3      25300          0
      5944          3      25300          1
      5944          3      25300          2
      5944          3      25300          3

一些使用ROWID的函數
ROWIDTOCHAR(rowid) :將ROWID轉換成STRING
CHARTOROWID('rowid_string') :將STRING轉換成ROWID

另外,就是自己寫(xiě)的一些函數:(下面的函數是網(wǎng)友eygle提供)

create or replace function get_rowid

(l_rowid in varchar2)
return varchar2
is
ls_my_rowid     varchar2(200);          
rowid_type     number;          
object_number     number;          
relative_fno     number;          
block_number     number;          
row_number     number;

begin
dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);          
ls_my_rowid := 'Object# is      :'||to_char(object_number)||chr(10)||
        'Relative_fno is :'||to_char(relative_fno)||chr(10)||
        'Block number is :'||to_char(block_number)||chr(10)||
        'Row number is   :'||to_char(row_number);
return ls_my_rowid ;
end;         

/

應用上面的函數如下:
SQL> select get_rowid(rowid), name from bruce_t;
GET_ROWID(ROWID)                                                                 NAME

-------------------------------------------------------------------------------- --------------------------------
Object# is      :5944                                                      BruceLau
Relative_fno is :3                                                               
Block number is :25300                                                           
Row number is   :0                                                               
Object# is      :5944                                                     MabelTang
Relative_fno is :3                                                               
Block number is :25300                                                           
Row number is   :1

ROWID:
    ROWID為該表行的唯一標識,是一個(gè)偽列,可以用在SELECT中,但不可以用INSERT, UPDATE來(lái)修改該值。
注意:ROWID的表指,普通表,cluster table, partition table, subpartition table, index, index partitions and subpartitions(注意:不包含index-organized tables).
    每個(gè)表Oracle都存在一個(gè)偽列ROWID,這個(gè)偽列可以用SELECT查看,但是不可以用INSERT, UPDATE來(lái)修改。你也不可以用DELETE來(lái)刪除
ROWID列,Oracle使用ROWID列來(lái)建立內部索引。你可以引用ROWID的值,但ROWID并不存放在數據庫中,你可以創(chuàng )建一個(gè)表包含ROWID數據類(lèi)型,
但Oracle不保證該值是合法的rowids。用戶(hù)必須確保該rowid值是真實(shí)合法的。
UROWID:
    UROWID(可以稱(chēng)為通用ROWID,邏輯ROWID): 表的行地址,表指的是index-organized tables。IOT中物理rowid是可能變化的,另外Oracle要依靠rowid來(lái)建立表的索引,所以對IOT表來(lái)物理rowid就不行了。Oracle以表的主鍵為基礎引入UROWID,在物理rowid基礎上建立了第二個(gè)索引。每一個(gè)邏輯rowid使用一個(gè)第二索引和一個(gè)物理推測(IOT中標識塊的行)。
    UROWID支持邏輯和物理的rowids,列UROWID類(lèi)型可以存儲各種rowids, 從8.1以后的Oracle才有UROWID類(lèi)型,它也可以用來(lái)保存以前的ROWID類(lèi)型數據信息。
    更新IOT的主鍵可能導致ROWID改變,該行的UROWID也會(huì )改變。

Oracle使用rowid數據類(lèi)型存儲行地址,rowid可以分成兩種,分別適于不同的對像

Physical rowids:存儲ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition

Logical rowids :存儲IOT的行地址

另一種rowid類(lèi)型叫universal rowed(UROWID),支持上述physical rowid和logical rowed,并且支持非oracle table,即支持所有類(lèi)型的rowid,但COMPATIBLE必須在8.1或以上.

1.1 ROWID偽列

    每個(gè)表在oracle內部都有一個(gè)ROWID偽列,它在所有sql中無(wú)法顯示,不占存儲空間;它用于從表中查詢(xún)行的地址或者在where中進(jìn)行參照,一個(gè)例子如下:

    SELECT ROWID, last_name FROM employees;

    Oracle內部使用保留在ROWID偽列中的值構建索引結構

    再次強調一次,rowid偽列不存儲在數據庫中,它不是數據庫數據,這是從database及table的邏輯結構來(lái)說(shuō)的,事實(shí)上,在物理結構上,每行由一個(gè)或多個(gè)row pieces組成,每個(gè)row piece的頭部包含了這個(gè)piece的address,即rowid.從這個(gè)意義上來(lái)說(shuō),rowid還是占了磁盤(pán)空間的.

   我們在創(chuàng )建表時(shí),可以為列指定為rowid數據類(lèi)型,但oracle并不保證列中的數據是合法的rowid值,必須由應用程序來(lái)保證,另外,類(lèi)型為rowid的列需要6 bytes存儲數據

1.2, physical rowids

   

只在行存在,它的物理地址rowid就不會(huì )變化,除非export/import,根據rowid可以直接定位到block去fetch數據,所以physical兼具有高穩定(stability)和高性能(performance)的特點(diǎn).

這里要注意一點(diǎn),對于clustered table來(lái)說(shuō),根據它的存儲特點(diǎn),在同一個(gè)block中的不同table的行可能具有同一個(gè)rowid;而nonclustered table,每一行或初始行片(initial row piece)都有唯一的rowid

要注意rowid的地址固定的特點(diǎn),在一個(gè)block的某一行被delete并commit后,它占據的address可以被其它事務(wù)新insert的行重用.

Physical rowid可以是下面任一一種格式:

    1) Extended rowid

        使用表空間相關(guān)的數據塊地址,8i及以上使用這種格式

       

2) Restricted rowid

   使用數據庫范圍的數據址地址,oracle 7或更早前的版本使用

1.2.1extened rowid

      擴展行地址是64編碼的物理地址,編碼字符是A-Z, a-z, 0-9, +,and/.

      由4部分組成OOOOOOFFFBBBBBBRRR (obj#file#block#row#)

      

      OOOOOO -–data object number

       FFF –-表空間相對的數據文件號

       BBBBBB –-塊號

       RRR ---行號

       注意不是16進(jìn)制表示

      SQL> select rowid,name from obj$ where rownum<=10;

ROWID             NAME

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

AAAAASAABAAAAB6ABc ACCESS$

AAAAASAABAAAC1QAAK AGGXMLIMP

AAAAASAABAAAC1QAAL AGGXQIMP

AAAAASAABAAAGiRAAI ALERT_QT

AAAAASAABAAAGiRAAh ALERT_QUE

AAAAASAABAAAGujAAo ALERT_QUE$1

AAAAASAABAAAGujAAp ALERT_QUE$1

AAAAASAABAAAGiRAAf ALERT_QUE_N

AAAAASAABAAAGiRAAe ALERT_QUE_R

AAAAASAABAAAGiRAAG ALERT_TYPE

我們可以使用dbms_rowid從extened rowid中抽取各部分信息,或者將extened rowid轉換成restricted rowed,詳細的信息參見(jiàn)sys.dbms_rowid的規范

#根據rowid抽塊對像編號

SQL> select dbms_rowid.rowid_object('AAAAASAABAAAGiRAAG') obj# from dual;

     OBJ#

----------

       18

#根據rowid抽取表空間相對文件號

SQL> select dbms_rowid.rowid_relative_fno('AAAAASAABAAAGiRAAG') rfile# from dual;

    RFILE#

----------

        1

#根據rowid抽取塊號

SQL> select dbms_rowid.ROWID_BLOCK_NUMBER('AAAAASAABAAAGiRAAG') block# from dual;

   BLOCK#

----------

    26769

#根據rowid抽取行號

SQL> select dbms_rowid.rowid_row_number('AAAAASAABAAAGiRAAG') row# from dual;

     ROW#

----------

        6

#將extended rowid轉換成為restricted rowid

SQL> select dbms_rowid.rowid_to_restricted('AAAAASAABAAAGiRAAG',0) restricted_rowid from dual;

RESTRICTED_ROWID

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

00006891.0006.0001

1.2.2restricted rowid

限制地址行號與擴展地址行號編碼方式不一樣,它在內部使用二進(jìn)制方式表示,當用select查詢(xún)時(shí),會(huì )轉換成varchar2/16進(jìn)制的混合形式,它的組織方式如下:

BBBBBBBB.RRRR.FFFF (block#.row#.file#)

注意,這里的文件號是絕對文件號,而extended rowid中是相對文件號(相對表空間)

Restricted rowid中不再有object number,因為從絕對文件號可以唯一確定數據塊

樣例可以參考前面的00006891.0006.0001

    另外請注意,塊中的行號是從0開(kāi)始

除了用dbms_rowid來(lái)抽取rowid的不同部分外,也可以用substr

#extended rowid

SQL> SELECT ROWID,

2007-02-01 15:19:28 
2         SUBSTR(ROWID,1,6) "OBJECT",
3         SUBSTR(ROWID,7,3) "FIL",
4         SUBSTR(ROWID,10,6) "BLOCK",
5         SUBSTR(ROWID,16,3) "ROW"
6   from obj$ where rownum<=5;

ROWID              OBJECT       FIL    BLOCK        ROW
------------------ ------------ ------ ------------ ------
AAAAASAABAAAAB6AAa AAAAAS       AAB    AAAAB6       AAa
AAAAASAABAAAAB6AAu AAAAAS       AAB    AAAAB6       AAu
AAAAASAABAAAAB6AAF AAAAAS       AAB    AAAAB6       AAF
AAAAASAABAAAAB6AAv AAAAAS       AAB    AAAAB6       AAv
AAAAASAABAAAAB6AAZ AAAAAS       AAB    AAAAB6       AAZ

#restricted rowid
SQL> SELECT ROWID, 
2         SUBSTR(ROWID,15,4) "FILE",
3         SUBSTR(ROWID,1,8) "BLOCK",
4         SUBSTR(ROWID,10,4) "ROW"
5   from obj$ where rownum<=5;

ROWID              FILE     BLOCK            ROW
------------------ -------- ---------------- --------
AAAAASAABAAAAB6AAa 6AAa     AAAAASAA         AAAA
AAAAASAABAAAAB6AAu 6AAu     AAAAASAA         AAAA
AAAAASAABAAAAB6AAF 6AAF     AAAAASAA         AAAA
AAAAASAABAAAAB6AAv 6AAv     AAAAASAA         AAAA
AAAAASAABAAAAB6AAZ 6AAZ     AAAAASAA         AAAA

請注意extented rowid與restricted rowid的編碼方式不一樣,大家不能拿兩種不同編碼方式的組件作比較,比如AAAAASAABAAAAB6AAa 這行的File#在兩種方式下是有不同的值,表示不同的意義,沒(méi)有可比性.

下面的語(yǔ)句可以查看表的數據分布在幾個(gè)文件中
SQL> SELECT COUNT(DISTINCT(SUBSTR(ROWID,7,3))) "FILES" FROM BOSSSTATSDATA;

     FILES
----------
        17
#下面驗證bossstatsdata的數據確實(shí)分布在17個(gè)文件中
SQL> select count(file_name) from dba_data_files where TABLESPACE_NAME= (select TABLESPACE_NAME from user_tables where table_name='BOSSSTATSDATA');

COUNT(FILE_NAME)
----------------
              17

總結Rowid的使用場(chǎng)景
1) 構建索引結構, 每個(gè)key都有一個(gè)rowid指向相應的表行
2) rowid是訪(fǎng)問(wèn)表行的最快的方法
3) rowid可用于觀(guān)察表數據是怎樣組織的
4) rowid是表行的唯一標識符

在任何DML中使用rowid時(shí),應該注意確保相關(guān)的行不會(huì )改變物理地址(不會(huì )被export/import,delete)

1.3 logical rowids
    用于表達IOT行地址的Logical rowid存儲在索引的葉子節點(diǎn)中,會(huì )隨著(zhù)索引entry的insert在塊內或塊間移動(dòng),所以,它不是基于物理地址而是基于primary key的標識符,所以取名叫logcial rowid
Oracle使用logical rowids來(lái)構建IOT的secondary indexes
由于在實(shí)際的應用中很少會(huì )使用到IOT這種對像,關(guān)于logical rowid更詳細的描述可以參見(jiàn)<<concepts>>中相關(guān)章節
Part IV Oracle Database Application Development
26 Native Datatypes
Overview of ROWID and UROWID Datatypes

1.4 非oracle table中的rowid
在非oracle系統中,不同的系統有不同的rowid格中

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
deadlock的一些Sample
Oracle的rowid
新書(shū)連載:深入剖析dump block對數據庫的影響
北極星Polestar Peter 修身、齊家、治國、平天下
DATA BLOCK內部結構的解析續二
linux輸入輸出重定向使用詳解(收藏)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久