informix/oracle rowid 问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了informix/oracle rowid 问题相关的知识,希望对你有一定的参考价值。

rowid是怎样的生成机制,比如,当一个表是新表,我插入数据时,rowid是连续的,如果我删除了几条记录,再插入数据,rowid是选择递增还是使用以前被删除记录的rowid?
我在插入记录时,怎么设置插入记录的rowid?

参考技术A rowid是Oracle自动生成的,不用人为的插入。 参考技术B 递增,ROWID无需人为干预。 参考技术C for informix:
在未做分片的表中,数据库按照表在DBS中的物理地址作为ROWID,此地址在DBS中是固定并且唯一的,所以,未分片表,数据库系统默认为其生成一个隐藏字段叫rowid。
而对于分片表,由于不同的记录在不同的DBS中可能有相同的物理地址,所以数据库没有为分片表默认生成ROWID,如果想在这些表上使用ROWID,则需要执行下面的操作:
ALTER TABLE table_name ADD ROWIDS;
或在建表时使用 WITH ROWIDS表达式
ps:建议在建完ROWID之后,对ROWID做一下统计更新:
update statistics high for table table_name(rowid)

[Oracle] rowid详解

一. rowid 

rowid实际上和rownum一样,都是oracle里的虚列,并不真正存在,但却具一个重要功能:

说明数据存在的数据文件\\块\\行,以便快速查找

二. 举例说明

-- 创建表test,插入20条数据
CREATE TABLE test as select ROWNUM AS rn FROM dual connect BY rownum <=20;
-- 通过dbms_rowid包查询各个rowid表示的文件\\块\\行
  SELECT tb.ROWID ,ddf.file_name ,dbms_rowid.rowid_block_number(tb.rowid) block_number,
  dbms_rowid.rowid_row_number(tb.rowid) row_number
    FROM test tb,dba_data_files ddf
  WHERE ddf.file_id=dbms_rowid.rowid_to_absolute_fno(tb.rowid,user,'TEST')
</pre><pre name="code" class="plain">
ROWID              FILE_NAME

                                                                                                             BLOCK_NUMBER ROW_NUMBER
------------------ -------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------ -
AAASRnAAEAAAALjAAA F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          0
AAASRnAAEAAAALjAAB F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          1
AAASRnAAEAAAALjAAC F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          2
AAASRnAAEAAAALjAAD F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          3
AAASRnAAEAAAALjAAE F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          4
AAASRnAAEAAAALjAAF F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          5
AAASRnAAEAAAALjAAG F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          6
AAASRnAAEAAAALjAAH F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          7
AAASRnAAEAAAALjAAI F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          8
AAASRnAAEAAAALjAAJ F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739          9
AAASRnAAEAAAALjAAK F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         10
AAASRnAAEAAAALjAAL F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         11
AAASRnAAEAAAALjAAM F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         12
AAASRnAAEAAAALjAAN F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         13
AAASRnAAEAAAALjAAO F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         14
AAASRnAAEAAAALjAAP F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         15
AAASRnAAEAAAALjAAQ F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         16
AAASRnAAEAAAALjAAR F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         17
AAASRnAAEAAAALjAAS F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         18
AAASRnAAEAAAALjAAT F:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF

                                                                                                                      739         19


.结论

试验得出:oracle的rowid存储了每一行数据的准确位置,除非对数据做了行迁移操作,否则这rowid不会随便变化。

以上是关于informix/oracle rowid 问题的主要内容,如果未能解决你的问题,请参考以下文章

说说Oracle的rowid

oracle中rowid怎么用?

Oracle数据库中rowid啥作用????!!!!!谢谢!!!!

oracle转储

如何从 ActiveRecord 访问隐藏列(在 Informix 中)

PostgreSQL兼容性之oracle的rowid(APP)