Oracle Rowid as function/procedureパラメーター
質問
関数または手順の入力パラメーターとして、RowIDタイプの使用に関するさまざまな意見を聞きたいと思います。
私は通常、入力パラメーターとして使用される一次キーを使用し、見ましたが、rowIDを入力パラメーターとして使用するためのいくつかの欠点はありますか?句で使用されると、シンプルで選択されたものはかなり速いと思います。
例えば:
FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...
解決
から コンセプトガイド:
物理的なrowidsは、特定のテーブルの行への可能な限り速いアクセスを提供します。それらは、行の物理アドレス(特定のブロックまで)を含み、1つのブロックアクセスで行を取得できるようにします。 Oracleは、列が存在する限り、そのRowidが変わらないことを保証します。
Rowidの主な欠点は、通常は安定しているが、状況によっては変更される可能性があることです。
- テーブルは再構築されています(
ALTER TABLE MOVE
...) - 明らかにエクスポート /インポート
- 行の移動を有効にするパーティションテーブル
一次キーが行を識別します 論理的に, 、削除+挿入の後でも、常に正しい行があります。 Rowidが行を識別します 物理的に 主キーほど永続的ではありません。
Oracleは結果がコヒーレントであることを保証するため、たとえばテーブル内の重複を削除するため、単一のSQLステートメントでRowIDを安全に使用できます。安全な側にいるために、私はあなたがRowidのみを使用することをお勧めします Accrossステートメント 行にロックがある場合(更新用に...選択してください)。
パフォーマンスの観点から見ると、プライマリキーアクセスはもう少し高価ですが、通常、これは多くのシングルローアクセスを行う場合にのみ気付くでしょう。ただし、パフォーマンスが重要である場合、通常、RowIDを使用した単一行処理よりも、セット処理を使用することでその場合、より大きな利点を得ることができます。特に、DBとアプリケーションの間に多くのラウンドトリップがある場合、行アクセスのコストはおそらくラウンドトリップコストと比較して無視できます。