Oracle ROWID作为函数/过程参数

Jok*_*ilä 3 oracle rowid

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

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

例如:

FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...
Run Code Online (Sandbox Code Playgroud)

Vin*_*rat 14

概念指南:

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

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

  • 表重建(ALTER TABLE MOVE...)
  • 显然导出/导入
  • 具有行移动启用的分区表

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

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

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