Oracle 10G:ORA_ROWSCNを使用してテーブルの行の変更を検出します(つまり、挿入、更新、削除)

dba.stackexchange https://dba.stackexchange.com/questions/5061

質問

テーブルのレコードが最後に更新、変更、または削除されたときのチェックに関するいくつかの調査により、Ora_Rowscnとして知られる擬似コラムに導かれました。

まず、私はこれを行います:

select max(ora_rowscn) from tablename;

番号に注意してください。次に、挿入、更新、削除を行い、それぞれ前後に最大値を確認します。それは、各タイプの変化を増加させるように見えます。

なぜ私がこれをしているのか疑問に思っているなら、C#Windowsサービスのエンティティのリストをキャッシュします。このサービスは2つのロードバランスの取れたサーバーで実行されるため、各実行のインスタンスが別々です。サーバーAで更新が発生した場合、サーバーBはそれについて知る必要があります。私がやりたいのは、max(ora_rowscn)を変数にキャッシュすることです。アプリケーションがレコードを挿入、更新、または削除するたびに、データベースから新しい最大値が取得されます。値が異なる場合、データベースから新しいリストを取得する必要があることは明らかです。

私の実際の質問はこれです。この値を増加させないレコードの挿入、更新、または削除につながる可能性があることに気づくべき他のひっかきりしたものはありますか?

編集: 誰かが追加できますか ora_rowscn タグとして?

役に立ちましたか?

解決

この値を増加させないレコードの挿入、更新、または削除につながる可能性があることに気付くべき他のひっかきりしたものはありますか?

ora_rowscnいつも 行が変更されたときに増加します - しかし、デフォルトの構成では、増加することもできます 行が変更されない場合

テーブル全体をudatesのことを確認する必要がある場合、1つの方法は 監査を使用します. 。一方、競合のために更新しようとしている行を確認するだけである場合、 ora_rowscnrowdependencies 理想的です。

他のヒント

MAX(ORA_ROWSCN)を取得するには、行うたびに完全なテーブルスキャンが必要です。毎回キャッシュ全体を更新するだけで速いかもしれません。

変更が行われたことと変更が何であるかを他のサービスに通知する方法が必要だと思われます。どのシステムが変更を消費する必要があるかを示す列でログテーブルを維持できます。列には、各サービスに2つの関数ベースのインデックスが1つある場合があり、各インデックスには消費する必要があるエントリのみが含まれます。その後、それらが消費されると、インデックスからそれを削除するために値のnullを作成できます。

または、Oracle'sを使用することもできます 高度なキューイング.

@Leigh Riffelが指摘したように、SERECT MAX(ORA_ROWSCN)が完全なテーブルスキャンになります。別の方法では、ステートメント実行の時間(SCNが生成/人口が生成されるときであるステートメントコミットメントと同じではない)に入力されるタイムスタンプ列(この例のSYS_TSを呼び出します)を使用することです。 sys_ts列のインデックスを使用すると、最新のx(たとえば25)行を調べて、それらの行からのみmax ora_rowscnを見つけることができます。

これを行うための最も簡単な方法は、この[1]に説明されているように、Rownumを使用して結果を制限することです。

select *
from (select sys_ts, ora_rowscn
from table order by SYS_TS desc) where rownum < 25;

残念ながら、それは完全なテーブルスキャンにもなります(少なくともOracle 11.2.0.3で)。これはOracleに報告されていますが、欠陥ではないと判断されました(バグ17347125)。

これには、同じ結果を効果的に達成するには、もう少し作業が必要です。

select b.sys_ts,b.ora_rowscn from
    (select rid from 
        (select rowid as rid from table order by sys_ts desc) 
    where rownum <= 25) a, table b
where a.rid = b.rowid;

[1] - http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top