落葉一飄

有時候感覺自己就像一片落葉,飄離枝頭后,就迷失了方向,永遠找不著歸宿……

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

第五部分 LONG类型
LONG是一种已经被弃用的数据类型,LOB类型是它的替代品.所以留在LOB之后进行讨论.
我们只需要简单的了解即可.为什么ORACLE还保留这种类型,只是为了向后兼容,在新的数据库设计是,不要再使用LONG类型列.
LONG类型有两种:
   LONG :能存储2GB的字符
   LONG RAW:能存储最多2GB的二进制数据.

我们只需要对LONG类型的限制进行了解即可.


LONG/LONG RAW 类型 CLOB/BLOB类型
一个表只能有一个LONG/LONG RAW列 一个表可以有最多1000个LOB类型列
不能用于用户自定义类型 可以用于用户自定义类型
WHERE中不能引用LONG类型 可以
除了NOT NULL,完整性约束中不能引用 可以
不支持分布式事务 支持
不能使用基本或高级复制技术 可以
不能在GROUP BY,ORDER BY,CONNECT BY,DISTINCT,UNIQUE,INTERSECT,MINUS,UNION中使用 可以通过函数来转换成一个标量SQL类型来支持
PL/SQL函数和过程中不能作为参数 可以
不能应用于内置函数,如SUBSTR 可以
CREATE TABLE AS SELECT不能使用LONG类型 支持
在有LONG类型的表中不能进行移动表空间 可以
总之一句话,新系统不应该再使用LONG类型.
老系统如果有的表的某些字段是LONG类型,要注意它的限制

 

 

第六部分 ROWID
ROWID 就是数据库中一行的地址,用于记录数据存储的一些属性,包括:记录存储所在的数据文件(file#),所属的数据库对象(obj#),所在的数据块号(block_no#),以及在表中的行号。这些属性就构成了Oracle 的ROWID.
我们需要注意的是在数据表中并没有一列来专门记录ROWID。
另外还有一个UROWID,它用于表,是行主键的一个表示,基于主键生成.一般是索引组织表在使用。索引组织表是没有ROWID的。
不管是ROWID还是UROWID,数据表都没有专门的一列来记录。
我们把这两种类型称为伪列。
SQL> create table test_rowid (id number(38));

Table created

SQL> insert into test_rowid values(1);

1 row inserted
SQL> select rowid, id from test_rowid;

ROWID                                                   ID
------------------ ---------------------------------------
AAAKsAAAEAAAAC+AAA                                       1

因为ROWID可以唯一的标识一条记录,所以索引中存储了ROWID值,通过索引访问记录,其实也就是通过从索引获得ROWID,再根据ROWID定位数据表中的记录。
但是当对表进行分区移动之后,索引就需要重建,因为存储位置已经发生了变化,索引中的ROWID已经不能再定位到新的数据了。
ORACLE 的ROWID一直在不断变化。
在ORACLE 6中,ROWID使用6bit来表示文件号。
在ORACLE 8,ROWID的组成是FFFF.BBBBBBBB.RRRR。占用6个字节。
10bit 的file#,22bit的block#,16bit的row #
在ORACLE 9中,Oracle 为ROWID引入了数据对象号的概念dataobj#.
现在ROWID格式变为OOOOOO.FFF.BBBBBB.RRR。最新的ROWID采用Base64编码,一共有18位,代表80位二进制数,其中:O为数据对象号,F是文件号,B是块号,R是行号
32 bit dataobj#+10bit rfile#,+22 bit block# +16bit row#

在以前ROWID是保持不变的,但现在ROWID是会发生改变的。如:
把一行从一个分区移到另一个分区
使用闪回表(flashback table)命令将一个数据表恢复到以前的某个时间点
对分区进行操作,如:移动,分解和合并
对段进行收缩
这些操作都会使ROWID发生变化,所以我们不应该把ROWID来作为唯一标识。而是使用一个单独的列为主键用来作数据行的唯一标识。另外主键约束可以实现引用完整性。而ROWID是无法做到的。

笔者曾经使用ROWID排序来实现按数据的写入顺序来显示数据。这在大多数情况下是可以做的,但是如果以后因为维护数据库,对分区进行操作后,这样做是不可行的。
所以应该使用单独的列来记录数据的写入顺序。
ROWID类型的主要用途是与数据库进行交互时,可以快速的指向某一行。比如使用ROWID更新某一行等。可以不通过索引而快速的找到某行记录。并且可以很快的进行行数据的验证。

posted on 2010-06-30 00:22  落葉一飄  阅读(203)  评论(0编辑  收藏  举报