2

今日、テーブルの変更をチェックする SQL を見つけました。以下のようになります。

SELECT MODEL_ID, STATUS_ID, COUNT(*) as QUANTITY, ORA_ROWSCN as CHANGE_NUM
FROM DEVICE 
GROUP BY MODEL_ID, STATUS_ID

DEVICE テーブルにレコードを 1 つ追加したところ、結果の QUANTITY は増加しましたが、CHANGE_NUM は変化しませんでした。

次に、ORA_ROWSCN が GROUP BY 句の一部ではないことに驚きました。これは、ORA_ROWSCN が疑似列であるためですか?

に変更ORA_ROWSCNしたところMAX(ORA_ROWSCN)、CHANGE_NUM が期待どおりに増加しました。

では、最初の sql で取得した ORA_ROWSCN は何でしょうか? グループの最初の変更番号? そして、この用法の意味は何ですか?

PS: Oracle Database 11g を使用しています

4

2 に答える 2

2

「ORA_ROWSCN が GROUP BY 句の一部ではないことに驚きました。ORA_ROWSCN が疑似列だからですか?」

はい。ORA_ROWSCN を SYSDATE などの別の疑似列に置き換えることができ、クエリは引き続き機能します。

「DEVICE テーブルにレコードを 1 つ追加したところ、結果の QUANTITY は増加しましたが、CHANGE_NUM は変化しませんでした」

ドキュメントによると、「Oracleは、行が存在するブロックに対してコミットされたトランザクションごとに SCN を追跡します。」(強調鉱山)。したがって、ROWDEPENDENCIES で SCN を追跡していない場合 (これがデフォルトです)、ORA_ROWSCN に表示される値は、最後にコミットされたトランザクションの SCN です。CHANGE_NUM は、誰か (必ずしもあなたではない) が COMMIT を発行するまで変更されません。

ROWDEPENDENCIES を持つテーブルを使用していた場合、コミットを発行するまで、ORA_ROWSCN 関数は null を返すことに注意してください。

どちらの場合でも、集計クエリを実行すると、ORA_ROWSCN の値はブロック (または、ROWDEPENDENCIES を使用する場合はテーブル) の最大値になります。

于 2012-08-14T12:50:54.143 に答える
0

以下のリンクを参照してください。

Oracle® データベース SQL リファレンス -> ORA_ROWSCN 疑似列

http://asktom.oracle.com -> ORA_ROWSCN 奇妙な動作

于 2012-08-14T09:45:41.943 に答える