关于ROWID的使用, 请教

[复制链接]
查看11 | 回复9 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
在程序中这样使用ROWID, 会不会有问题:
JAVA (JDBC)
从数据库中取出 一批记录(含ROWID), 然后针对每条记录做处理---- 对每条记录数据计算, 然后把结果update 回该记录,
UPDATE TBL
SET RESULT=
WHERE ROWID=v_ROWID;
我想问的是, 若表TBL中的记录发生 行迁移 (或其他什么)的话, 记录的ROWID会不会改变?会不会UPDATE找不到记录或改了其他记录?

回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
我顶
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
就算有索引,也没有问题
当发生行迁移的时候
在原来的rowid上保留有指向新地址的指针
这个时候如果存在索引,但索引列没有发生变化
索引中的rowid仍然是没有变的
只是这种情况多了
将对i/o构成问题
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
Thks biti_rainy, 这下我心里塌实了
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
a rowid will change with an ALTER TABLE [table] MOVE command,an export and import,or the row being deleted and reinserted
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
我想是这样的
如果你读取rowid时间没有lock的话
数据还是有可能被更新到其他数据上的
假设你开了两个SQLPLUS
1个做select rowid and updata
1个做其他的操作
如果select rowid 和 update之间有足够长的时间的话
而且1个sqlplus在做大量的更新
update 的rowid 还是有可能更新到其他数据上的
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
在原来的地方保留了地址指针的
所以对于索引来说(只要索引列不变化)
可以不发生变化
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 jiang 发布
[B]
在程序中这样使用ROWID, 会不会有问题:
JAVA (JDBC)
从数据库中取出 一批记录(含ROWID), 然后针对每条记录做处理---- 对每条记录数据计算, 然后把结果update 回该记录,
UPDATE TBL
SET RESULT=
WHERE ROWID=v_ROWID;
我想问的是, 若表TBL中的记录发生 行迁移 (或其他什么)的话, 记录的ROWID会不会改变?会不会UPDATE找不到记录或改了其他记录?
[/B]

首先,我认为发生Row Migration的时候,rowid不会改变,再有,为什么通过增大PCTFREE的值来避免行迁移的发生呢,呵呵


回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
应该说以上几位说的都没有错,行迁移确实不会改变rowid,原来的位置保留了指向新位置的指针,但并不是说rowid就不可能发生变化,alter table ... move to new_tablespace 和导出、导入操作都能改变rowid。
pctfree增大可以增大预留在块内的空间,当update时就不会因为该行增长的空间不够而导致row migaration。
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 jiang 发布
[B]
在程序中这样使用ROWID, 会不会有问题:
JAVA (JDBC)
从数据库中取出 一批记录(含ROWID), 然后针对每条记录做处理---- 对每条记录数据计算, 然后把结果update 回该记录,
UPDATE TBL
SET RESULT=
WHERE ROWID=v_ROWID;
我想问的是, 若表TBL中的记录发生 行迁移 (或其他什么)的话, 记录的ROWID会不会改变?会不会UPDATE找不到记录或改了其他记录?
[/B]

As others say, rowid still works unless you alter table move tablespace to another tablespace. But using ROWIDs directly may be bad programming practice. To say the least, if you upgrade your database later and if the ROWID format changes, your program may stop working. (But UPDATE TBL SET RESULT= aaa WHERE ROWID=v_ROWID still works.)
Steven Feuerstein in his "Oracle PL/SQL Programming" p.100 "I'm not convinced that the theoretical performance gains of searching by rowid justy its use".
Yong Huang
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行