知りたいのですが、Oracle の ROWID は段階的に生成されますか? 以下のクエリを試してみると
select min(ROWID) from table
テーブルに最初に挿入された行の ROWID を常に取得するのでしょうか、それともランダムな行の ROWID を取得することになるのでしょうか? 誰かがこれに光を当ててくれればとても助かります
「最小」ROWID は、テーブルから最初に挿入された行を常に提供するとは限りません。ドキュメントから引用するには:
行 ID が行ピースに割り当てられた後、特別な状況で行 ID が変更されることがあります。たとえば、行の移動が有効になっている場合、パーティション・キーの更新、表のフラッシュバック操作、表の縮小操作などが原因で行IDが変更される可能性があります。行の移動が無効になっている場合、行がOracle Databaseユーティリティを使用してエクスポートおよびインポートされると、ROWIDが変更される可能性があります。
「その他」は、ROWID が変更される原因となる多くの理由があることを示しています。これは、小さな例で簡単に実証できます。
create table tmp_test ( a number );
insert into tmp_test values (1);
select rowid, a from tmp_test;
ROWID A
------------------ ----------
AABo3AAFvAAAda6AAA 1
alter table tmp_test move;
select rowid, a from tmp_test;
ROWID A
------------------ ----------
AABo3BAFvAAAdbjAAA 1
操作の後alter table
、唯一の行 ID が変更されていることがわかります。
行 ID が変更される可能性があり、Oracle が「最小の」行 ID が常に最初に挿入される行になることを明示的に保証していない場合、必要に応じてこれを追跡する別の方法が必要です。タイムスタンプまたは増分シーケンスは正常です。
データを参照せずに最初に挿入された行を見つけることは、かなり珍しい要件であるに違いありません。これを使用することを検討している場合は、なぜこれを行う必要があるのかをもう一度見てみましょう。
min(ROWID)
常にテーブルの最初の行を返します。
データベース内の行ごとに、ROWID 疑似列は行のアドレスを返します。Oracle DatabaseのROWID値には、行の検索に必要な情報が含まれています:
- オブジェクトのデータオブジェクト番号
- 行が存在するデータファイル内のデータブロック
- データ ブロック内の行の位置 (最初の行は 0)
- 行が存在するデータファイル (最初のファイルは 1)。ファイル番号は、テーブルスペースに対して相対的です。
通常、rowid 値は、データベース内の行を一意に識別します。ただし、同じクラスターに一緒に保管されている異なる表の行は、同じ行 ID を持つことができます。
詳しくは公式サイトはこちら。