ROWID

最近更新时间: 2024-10-17 17:10:00

Oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为ROWID,在Oracle内部通常就是使用它来访问数据的。ROWID需要 10个字节的存储空间,并用18个字符来显示。该值表明了该行在Oracle数据库中的物理具体位置。可以在一个查询中使用ROWID来表明查询结果中包含该值。

保存ROWID需要10个字节或者是80个位二进制位。这80个二进制位分别是:

  1. 数据对象编号,表明此行所属的数据库对象的编号,每个数据对象在数据库建立的时候都被唯一分配一个编号,并且此编号唯一。数据对象编号占用大约32位。

  2. 对应文件编号,表明该行所在文件的编号,表空间的每一个文件标号都是唯一的。文件编号所占用的位置是10位。

  3. 块编号,表明改行所在文件的块的位置块编号需要22位。

  4. 行编号,表明该行在行目录中的具体位置行编号需要16位。

这样加起来就是80位。

Oracle的物理扩展ROWID有18位,每位采用64位编码,分别用AZ、az、0~9、+、/共64个字符表示。A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

TDSQL PG 兼容Oracle的ROWID,由

使用限制

关于使用ROWID的一些注意事项:

  • 参数default_with_rowid可以设置默认建表时是否带ROWID,默认该值为off;可以根据需要修改该参数。

  • default_with_rowid=OFF时,也可以通过create table 时加上with (rowids)来让表带ROWID列。

  • ROWID列默认没有索引,所以基于该列的sql可能存在性能问题,可能通过创建索引来提高sql效率,建索引语法与普通字段建索引语法相同。

  • 不支持Oracle的DBMS_ROWID包调用。

  • cluster table、vacuum full table重写表数据后,ROWID会变,与Oracle一致。

语法

default_with_rowid=off,建表时带ROWID语法,示例:

CREATE TABLE[ IF NOT EXISTS ] table_name 
 ( [
   { column_name data_type [ COLLATE collation] [ column_constraint [ ... ] ]
     | table_constraint
     | LIKE source_table [ like_option ... ] }
     [, ... ]
 ] )
 [ INHERITS ( parent_table [, ... ] ) ]
 [ PARTITION BY { RANGE | LIST | HASH } ( {column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
 [ WITH ( storage_parameter [= value] [, ... ]) | WITH OIDS | WITHOUT OIDS ]
 WITH ( ROWIDS ) ;

示例:

postgres=#create table t_rowid(f1 int,f2 varchar2(32)) with (rowids);
CREATE TABLE
postgres=#insert into t_rowid(f1,f2) values(1,'ONE');
INSERT 0 1
postgres=#insert into t_rowid(f1,f2) values(2,'TWO');
INSERT 0 1
postgres=#select rowid,* from t_rowid;
        rowid         | f1 | f2  
----------------------+----+-----
 XPK3fw==AQAAAAAAAAA= |  1 | ONE
 XPK3fw==AgAAAAAAAAA= |  2 | TWO

postgres=#select rowid,* from t_rowid where rowid='XPK3fw==AgAAAAAAAAA=';
        rowid         | f1 | f2  
----------------------+----+-----
 XPK3fw==AgAAAAAAAAA= |  2 | TWO
(1 row)

postgres=#update t_rowid set f2='TWO1' where f1=2;
UPDATE 1
postgres=#select rowid,* from t_rowid where rowid='XPK3fw==AgAAAAAAAAA=';
        rowid         | f1 | f2  
----------------------+----+------
 XPK3fw==AgAAAAAAAAA= |  2 | TWO1
(1 row)

#数据更新,ROWID不变。

postgres=#create index idx_t_rowid_rowid on t_rowid(rowid);
CREATE INDEX
postgres=#explain select rowid,* from t_rowid where rowid='XPK3fw==AgAAAAAAAAA=';
                                       QUERY PLAN                                      
----------------------------------------------------------------------------------------
 Remote Fast Query Execution  (cost=0.00..0.00 rows=0 width=0)
   Node/s: dn001, dn002
   -> Index Scan using idx_t_rowid_rowid on t_rowid  (cost=0.13..4.15 rows=1 width=98)
         Index Cond: (rowid ='XPK3fw==AgAAAAAAAAA='::rowid)
(4 rows)

支持ROWID字段上创建索引。