oracle 中 rowid是个伪列select 的时候是不显式的。
[quote]1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。
2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。
3、利用rowid是访问表中一行的最快方式。
4、rowid需要10个字节来存储,显示为18位的字符串。
rowid的组成结构为:
data object number(6位字符串)+relative file number(3位字符串)+block number(6位字符串)+row number(3位字符串),如:AAAADeAABAAAAZSAAA
5、我们可以借助oracle提供的包dbms_rowid,来对rowid进行解析从而获取关于行的相关信息:
bossdb-SQL>select
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from p_test where rownum<5;
ROWID OBJ_ID DF# BLKNUM ROWNO
------------------ ---------- ---------- ---------- ----------
AAAQ+tAANAAAC6SAAA 69549 13 11922 0 AAAQ+tAANAAAC6SAAB 69549 13 11922 1 AAAQ+tAANAAAC6SAAC 69549 13 11922 2 AAAQ+tAANAAAC6SAAD 69549 13 11922 3
我们可以看到,通过rowid_row_number得到的行号是从0开始的,这是和rownum伪列的一个不同之处。我猜测rowid_row_number在求行号的时候是计算首行的偏移量。
一般来说,当表中的行确定后,rowid就不会发生变化。
但当如下情况发生时,rowid将发生改变:
1、对一个表做表空间的移动后
2、对一个表进行了EXP/IMP后
1. DBMS_ROWID.ROWID_BLOCK_NUMBER:返回一个rowid的block号
2.DBMS_ROWID.ROWID_CREATE:创建并返回一个基于单独行的rowid,创建的rowid类型是 RESTRICTED或者是EXTENDED,这种功能一般都是用于测试目的,因为只有oracle才能创建一个合法的rowid指向数据。
3.DBMS_ROWID.ROWID_INFO: 返回一个单独组件的一个指定的rowid,它只能用于PL/SQL,而不能用于sql语句中。
4.DBMS_ROWID.ROWID_OBJECT:返回一个rowid的对象号。如果是restricted 的rowid,则返回0。
5. DBMS_ROWID.ROWID_RELATIVE_FNO: 返回一个rowid的相对文件号。
6.DBMS_ROWID.ROWID_ROW_NUMBER:返回一个rowid的行号。(从零开始)
7.DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO:返回一个rowid的完全文件号。
8.DBMS_ROWID.ROWID_TO_EXTENDED: 转换一个restricted rowid为一个extended rowid.如果原始的rowid存储在列中,转换的 就是internal类型;如果原始的rowid是以字符串形式存储的,那转换的就是external类型。
9.DBMS_ROWID.ROWID_TO_RESTRICTED:转换一个exteneded的rowid为一个restricted的rowid,restricted的rowid格式为BBBBBBB.RRRR.FFFFF, BBBBBBB代表block,RRRR 代表在block中的行
[/quote]
心的:
删除大数据量的方法: 得到rowid 然后按照rowId去做删除,这样应该挺快,但是我觉得利用 oracle truncate table 这个也挺快的。
建立物化视图的时候,多个表关联,这是可以考虑把rowid加上。
必要时会使用这一列。(UCI就是这样用的 )
[quote]1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。
2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。
3、利用rowid是访问表中一行的最快方式。
4、rowid需要10个字节来存储,显示为18位的字符串。
rowid的组成结构为:
data object number(6位字符串)+relative file number(3位字符串)+block number(6位字符串)+row number(3位字符串),如:AAAADeAABAAAAZSAAA
5、我们可以借助oracle提供的包dbms_rowid,来对rowid进行解析从而获取关于行的相关信息:
bossdb-SQL>select
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from p_test where rownum<5;
ROWID OBJ_ID DF# BLKNUM ROWNO
------------------ ---------- ---------- ---------- ----------
AAAQ+tAANAAAC6SAAA 69549 13 11922 0 AAAQ+tAANAAAC6SAAB 69549 13 11922 1 AAAQ+tAANAAAC6SAAC 69549 13 11922 2 AAAQ+tAANAAAC6SAAD 69549 13 11922 3
我们可以看到,通过rowid_row_number得到的行号是从0开始的,这是和rownum伪列的一个不同之处。我猜测rowid_row_number在求行号的时候是计算首行的偏移量。
一般来说,当表中的行确定后,rowid就不会发生变化。
但当如下情况发生时,rowid将发生改变:
1、对一个表做表空间的移动后
2、对一个表进行了EXP/IMP后
1. DBMS_ROWID.ROWID_BLOCK_NUMBER:返回一个rowid的block号
2.DBMS_ROWID.ROWID_CREATE:创建并返回一个基于单独行的rowid,创建的rowid类型是 RESTRICTED或者是EXTENDED,这种功能一般都是用于测试目的,因为只有oracle才能创建一个合法的rowid指向数据。
3.DBMS_ROWID.ROWID_INFO: 返回一个单独组件的一个指定的rowid,它只能用于PL/SQL,而不能用于sql语句中。
4.DBMS_ROWID.ROWID_OBJECT:返回一个rowid的对象号。如果是restricted 的rowid,则返回0。
5. DBMS_ROWID.ROWID_RELATIVE_FNO: 返回一个rowid的相对文件号。
6.DBMS_ROWID.ROWID_ROW_NUMBER:返回一个rowid的行号。(从零开始)
7.DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO:返回一个rowid的完全文件号。
8.DBMS_ROWID.ROWID_TO_EXTENDED: 转换一个restricted rowid为一个extended rowid.如果原始的rowid存储在列中,转换的 就是internal类型;如果原始的rowid是以字符串形式存储的,那转换的就是external类型。
9.DBMS_ROWID.ROWID_TO_RESTRICTED:转换一个exteneded的rowid为一个restricted的rowid,restricted的rowid格式为BBBBBBB.RRRR.FFFFF, BBBBBBB代表block,RRRR 代表在block中的行
[/quote]
心的:
删除大数据量的方法: 得到rowid 然后按照rowId去做删除,这样应该挺快,但是我觉得利用 oracle truncate table 这个也挺快的。
建立物化视图的时候,多个表关联,这是可以考虑把rowid加上。
必要时会使用这一列。(UCI就是这样用的 )