ROWID
最近更新时间: 2024-10-17 17:10:00
Oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为ROWID,在Oracle内部通常就是使用它来访问数据的。ROWID需要 10个字节的存储空间,并用18个字符来显示。该值表明了该行在Oracle数据库中的物理具体位置。可以在一个查询中使用ROWID来表明查询结果中包含该值。
保存ROWID需要10个字节或者是80个位二进制位。这80个二进制位分别是:
数据对象编号,表明此行所属的数据库对象的编号,每个数据对象在数据库建立的时候都被唯一分配一个编号,并且此编号唯一。数据对象编号占用大约32位。
对应文件编号,表明该行所在文件的编号,表空间的每一个文件标号都是唯一的。文件编号所占用的位置是10位。
块编号,表明改行所在文件的块的位置块编号需要22位。
行编号,表明该行在行目录中的具体位置行编号需要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字段上创建索引。