天天看點

應用ROWDEPENDENCIES行級跟蹤,查詢oracle表中資料行上最後的DML時間

  在Oracle 10g中的引入了ORA_ROWSCN僞列新特性。基于此種僞列所提供的資訊,我們可以友善地找出某個資料塊或某一個行最近被修改

的時間戳。它又分為兩種模式:一種是基于block這是預設的模式(塊級跟蹤,非行依賴性(NOROWDEPENDENCIES));還有一種是基于row上,這種模式隻能在建裡表時指定ROWDEPENDENCIES(行級跟蹤),不可以通過後期的alter  table語句來将表修改為ROWDEPENDENCIES。

       我們知道,每個Block在頭部是記錄了該block最近事務的SCN的,是以預設情況下,隻需要從block頭部直接擷取這個值就可以了,不需要其他任何的開銷,Oracle就能做到這一點。但是這明顯是不精确的,一個block中會有很多行記錄,每次事務不可能影響到整個block中所有的行,是以這是一個非常不精準的估算值,同一個block的所有記錄的ORA_ROWSCN都會是相同的,基本上沒有多大的使用價值。

       如果在建表的時候開啟行級跟蹤選項,Oracle則可以為每一行記錄精确的SCN,那麼顯然不能再直接從block頭部擷取。要獲得足夠的資訊,肯定要付出一定的代價,Oracle必須為每一行存儲這個實際的SCN。是以這個行級跟蹤的選項,隻能在建表的時候指定,而不能通過alter table來修改現有的表,否則需要修改每一行記錄的實體存儲格式,代價是可想而知的。

在10g之前,很多系統要實作增量資料抽取,要麼通過解析日志,要麼加觸發器,要麼就在表上加一個時間截字段。ORA_ROWSCN其實就是第三種方式,隻是這個字段由Oracle來維護,這樣可以避免一些應用繞過時間截去更新其他字段帶來的問題。

下面是官方說明:

NOROWDEPENDENCIES | ROWDEPENDENCIES

This clause lets you specify whether table will use row-level dependency tracking.

With this feature, each row in the table has a system change number (SCN) that

represents a time greater than or equal to the commit time of the last transaction that

modified the row. You cannot change this setting after table is created.

ROWDEPENDENCIES Specify ROWDEPENDENCIES if you want to enable row-level

dependency tracking. This setting is useful primarily to allow for parallel propagation

in replication environments. It increases the size of each row by 6 bytes.

NOROWDEPENDENCIES Specify NOROWDEPENDENCIES if you do not want table

to use the row-level dependency tracking feature. This is the default.

      在預設情況下,10g下表會以非行依賴性(NOROWDEPENDENCIES)的屬性建立,這意味着我們可觀察的ORA_ROWSCN資訊是以塊級跟蹤的,無法分辨同一塊内的多行間不同的修改時間。為了達到行級粒度的跟蹤我們需要在建表時指定基于行依賴性的ROWDEPENDENCIES字句。舉例如下: