Oracle ROWID作为函数/过程参数

时间:2011-02-02 10:13:37

标签: oracle rowid

我只是想听听有关ROWID类型用法作为任何函数或过程的输入参数的不同意见。

我通常使用和看到主键用作输入参数但是使用ROWID作为输入参数有一些缺点吗?我认为这很简单,如果在WHERE子句中使用,选择很快。

例如:

FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...

1 个答案:

答案 0 :(得分:14)

来自concept guide

  

物理rowid提供对给定表的行的最快访问。它们包含行的物理地址(直到特定块),并允许您在单个块访问中检索行。 Oracle保证只要该行存在,其rowid就不会改变。

ROWID的主要缺点是虽然它通常是稳定的,但在某些情况下可能会发生变化:

  • 表格已重建(ALTER TABLE MOVE ...)
  • 明显导出/导入
  • 启用行移动的分区表

主键在逻辑上标识行 ,即使在删除+插入后,您也总能找到正确的行。 ROWID标识行物理,并且不像主键那样持久。

您可以在单个SQL语句中安全地使用ROWID,因为Oracle将保证结果一致,例如删除表中的重复项。为了安全起见,我建议您在行上锁定时使用ROWID accross语句(SELECT ... FOR UPDATE)。

从性能的角度来看,主键访问有点贵,但只有在进行大量单行访问时才会注意到这一点。如果性能至关重要,那么通常使用set处理比使用rowid进行单行处理可以获得更大的好处。特别是,如果DB与应用程序之间存在大量往返,则与往返成本相比,行访问的成本可能会忽略不计。