3

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

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

例如:

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

1 回答 1

15

概念指南

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

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

  • 该表已重建(ALTER TABLE MOVE...)
  • 出口/进口明显
  • 启用行移动的分区表

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

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

从性能的角度来看,主键访问要贵一些,但通常只有在执行大量单行访问时才会注意到这一点。但是,如果性能很关键,那么在这种情况下,使用集合处理通常可以获得比使用 rowid 的单行处理更大的好处。特别是,如果数据库和应用程序之间有很多往返,那么与往返成本相比,行访问的成本可能可以忽略不计。

于 2011-02-02T10:31:13.097 回答