外部表的ROWID信息

ROWID是访问数据库中表的物理地址信息,Oracle提供了ROWID伪列,可以通过ROWID直接访问表中的数据。

ROWNUM固化外部表结果集存在问题:http://yangtingkun.net/?p=38

ROWNUM固化外部表结果集存在问题(二):http://yangtingkun.net/?p=103

 

 

在测试外部表时,意外发现,外部表同样存在ROWID伪列:

SQL> create directory d_alert as 'D:\ORACLE\PRODUCT\ADMIN\YTK102\BDUMP';

目录已创建。

SQL> create table t_alert
  2  (text varchar2(1000)
  3  )
  4  organization external
  5  (type oracle_loader
  6  default directory d_alert
  7  access parameters
  8  (records delimited by newline
  9  fields (text (1:255) char))
 10  location ('alert_ytk102.log'));

表已创建。

SQL> select * from t_alert where rownum < 10;

TEXT
-----------------------------------------------------------------------------
Dump file d:\oracle\product\admin\ytk102\bdump\alert_ytk102.log
Sat Dec 25 15:55:43  2010
ORACLE V10.2.0.5.0 - Production vsnsta=0
vsnsql=14 vsnxtr=3
Windows NT Version V6.1
CPU                 : 4 - type 586, 2 Physical Cores
Process Affinity    : 0x00000000
Memory (Avail/Total): Ph:1594M/2995M, Ph+PgF:4318M/5989M, VA:1911M/2047M
Sat Dec 25 15:55:43  2010

已选择9行。

SQL> SELECT ROWID FROM T_ALERT WHERE ROWNUM < 10;

ROWID
-----------------------
(AADRCQAAAAAAAAAAAAAAAA
(AADRCQAAAAAAAAAAAAAAQQ
(AADRCQAAAAAAAAAAAAAAXA
(AADRCQAAAAAAAAAAAAAAhg
(AADRCQAAAAAAAAAAAAAAmg
(AADRCQAAAAAAAAAAAAAAtA
(AADRCQAAAAAAAAAAAAAA6g
(AADRCQAAAAAAAAAAAAABDA
(AADRCQAAAAAAAAAAAAABVg

已选择9行。

显然外部表的ROWID和普通表的ROWID有着明显的区别,其长度并非18位,换句话说,外部表的ROWID并非是OBJECT_ID + RELATIVE FILE_ID + BLOCK_NUMBER + ROW_NUMBER格式。

既然外部表的ROWID并不代表一个物理地址,因此一般也没有机会去使用这个ROWID,不过有时确实需要使用一个ROWID来解决真实的问题:

SQL> WITH A AS (SELECT ROW_NUMBER() OVER(ORDER BY ROWID) RN, TEXT FROM T_ALERT)
  2  SELECT * FROM A B
  3  WHERE B.RN >= (SELECT MIN(C.RN) FROM A C WHERE TEXT = 'Mon Sep 19 07:18:21  2011');

        RN TEXT
---------- --------------------------------------------------------------------------------
      5739 Mon Sep 19 07:18:21  2011
      5740 Successfully onlined Undo Tablespace 1.
      5741 Mon Sep 19 07:18:21  2011
      5742 SMON: enabling tx recovery
      5743 Mon Sep 19 07:18:21  2011
      5744 Database Characterset is ZHS16GBK
      5745 Opening with internal Resource Manager plan
      5746 replication_dependency_tracking turned off (no async multimaster replication found)
      5747 Starting background process QMNC
      5748 QMNC started with pid=17, OS id=5412
      5749 Mon Sep 19 07:18:29  2011
      5750 Completed: alter database open

已选择12行。

由于ROW_NUMBER分析函数需要一个ORDER BY排序字段,而在这个例子中,依赖于外部表的读取顺序,而并没有任何一个列能标识这个顺序,而ROWID变成了唯一的选项,恰好Oracle在实现外部表的伪列的时候,ROWID的大小是根据外部表数据读取顺序递增的,因此这里使用ROWID作为ORDER BY的排序列,可以满足查询的要求,这也是外部表ROWID有意义的应用之一。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-708614/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-708614/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值