2011-02-02 42 views
3

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

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

例如:

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

回答

14

concept guide

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

一个ROWID的主要缺点是,虽然它通常是稳定的,它可以在某些情况下改变:

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

主键标识一行升ogically,即使在删除+插入后,您仍然可以找到正确的行。一个ROWID标识物理上的,并不像主键一样持久。

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

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

+0

这就是我想知道的,即某些原因不使用它:)谢谢! – 2011-02-02 10:39:24