我只是想听听有关ROWID类型用法作为任何函数或过程的输入参数的不同意见。
我通常使用和看到主键用作输入参数但是使用ROWID作为输入参数有一些缺点吗?我认为这很简单,如果在WHERE子句中使用,选择很快。
例如:
FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...
答案 0 :(得分:14)
物理rowid提供对给定表的行的最快访问。它们包含行的物理地址(直到特定块),并允许您在单个块访问中检索行。 Oracle保证只要该行存在,其rowid就不会改变。
ROWID的主要缺点是虽然它通常是稳定的,但在某些情况下可能会发生变化:
ALTER TABLE MOVE
...)主键在逻辑上标识行 ,即使在删除+插入后,您也总能找到正确的行。 ROWID标识行物理,并且不像主键那样持久。
您可以在单个SQL语句中安全地使用ROWID,因为Oracle将保证结果一致,例如删除表中的重复项。为了安全起见,我建议您在行上锁定时使用ROWID accross语句(SELECT ... FOR UPDATE)。
从性能的角度来看,主键访问有点贵,但只有在进行大量单行访问时才会注意到这一点。如果性能至关重要,那么通常使用set处理比使用rowid进行单行处理可以获得更大的好处。特别是,如果DB与应用程序之间存在大量往返,则与往返成本相比,行访问的成本可能会忽略不计。