2011-02-02 21 views
3

ROWID型の使用方法について、関数またはプロシージャの入力パラメータとして異なる意見を聞きたいだけです。関数/プロシージャ・パラメータとしてのOracle ROWID

入力パラメータとして主キーが使用されていましたが、ROWIDを入力パラメータとして使用するには何らかの欠点がありますか?私はそれがとてもシンプルだと思うし、WHERE句で使用するとかなり素早く選択できます。例えば

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

答えて

14

concept guideより:

物理ROWIDは、特定の表の行に最速のアクセスを提供します。それらは行の物理アドレス(特定のブロックまで)を含み、単一のブロックアクセスで行を取り出すことができます。行が存在する限り、そのROWIDは変更されません。明らかに、テーブルが再構築される

  • ALTER TABLE MOVE ...)
  • エクスポート/インポート:

ROWIDの主な欠点は、それが正常に安定であるが、それはいくつかの状況下で変更できることです行移動に

  • パーティションテーブル
  • を有効に主キーは行リットルを識別するogically、削除+挿入の後であっても、正しい行が常に見つかります。 ROWIDは行を物理的にと識別し、主キーと同様に永続的ではありません。

    単一のSQL文でROWIDを安全に使用できます。これは、結果が一貫していることを保証するためです(表の重複を削除するなど)。安全な側になるためには、行にロックがあるとき(SELECT ... FOR UPDATE)、ROWID アロス・ステートメントのみを使用することをお勧めします。

    パフォーマンスの観点からは、プライマリキーのアクセスは少し高額ですが、通常は1行のアクセスが多い場合にのみこれに気づくでしょう。ただし、パフォーマンスが重要な場合は、通常、ROWIDを使用した単一行処理よりも、集合処理を使用する方がより大きなメリットを得ることができます。特に、DBとアプリケーションの間に多くの往復がある場合、行アクセスのコストはおそらく往復コストに比べて無視できる程度です。

    +0

    これは私が知りたかったもの、つまり使用しない理由です:)ありがとう! –

    関連する問題