ORA_ROWSCN與按照commit時間對記錄進行排序
問題的提出:
在併發的環境下,每個sql先執行的不一定先提交,因此想如何才能按照事務提交的順序來對記錄進行排序而不是按照sql執行的時間。
先來說說sysdate或者systimestamp,如果系統中使用這樣的列來記錄每個記錄最後提交的時間,那是錯誤的。而且很多人認為這個時間如果設定為default值,那麼記錄的就是sql執行的時間,其實也是錯誤的。oracle 10.2 版本的concept第388頁有這樣一句話“Default values are included as part of an INSERT statement before the statement is parsed.”因此可以看到,把列的default值設定為預設值,或者insert into table(col1...) values (sysdate,...)的方式最後得到的時間都是sql解析的時間而不是sql執行的時間。
ORA_ROWSCN是oracle 10G版本中提出的概念,是一個偽列,用來記錄資料提交時候的scn,而scn是唯一的,而且scn的先後就是commit的時間的先後(雖然事務commit不是導致scn增長的唯一因素)。因此可以按照這個偽列進行排序,得到的結果就是事務提交的先後進行的排序。
預設的建表方式的ORA_ROWSCN記錄的scn是精確到每個block而不是精確到block中的每個row的,因為ORA_ROWSCN取自data block header的scn。要使用此特性需要使用以下方式建表:create table tab(col1 number) rowdependencies。這樣就可以為每個列儲存自己的scn,需要增加每行資料6個位元組的空間的開銷。
另外,oracle還提供了ORA_ROWSCN到TIMESTAMP的轉換,可以得到每個記錄最後的修改時間,但這個時間和真正的資料發生變化的時間有誤差,誤差在正負3秒(引用自TOM,是否是因為每3秒SCN會刷一次有關呢?有待驗證)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25016/viewspace-921602/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JN專案-對社團申請進行排序,按照申請時間和稽核時間降序排序
- 基於python對B站收藏夾按照視訊釋出時間進行排序Python排序
- Map按照key和value進行排序排序
- 「Js」物件按照鍵名來進行排序JS物件排序
- mysql按照漢字拼音進行order by排序MySql排序
- MapReduce 按照Value值進行排序輸出排序
- Linux中ls對檔案進行按大小排序和按時間排序Linux排序
- 欄位按照指定 ID 順序進行排序排序
- 使用SQL按照區間進行分組SQL
- 如何按最後修改時間對 ls 命令的輸出進行排序排序
- 對字典進行排序排序
- 記錄ORACLE語句的執行時間Oracle
- Python對字典進行排序Python排序
- 對N個數進行排序排序
- java對中文(拼音)進行排序Java排序
- R語言記錄程式執行的時間R語言
- 如何不用演算法對陣列進行(0時間複雜度,0空間複雜度)排序?演算法陣列時間複雜度排序
- 對目錄進行操作
- 按照價格排序!排序
- 壓測時介面都按照順序去執行對嗎?
- 對序列進行遷移時產生間斷的原因
- python 對字典的值進行排序Python排序
- 一個命令對文字進行高效排序排序
- ORDER對查詢結果進行排序排序
- 使用XPathExpression類對XML進行排序 (轉)ExpressXML排序
- 【Oracle】對RID為偶數的記錄進行操作Oracle
- 短視訊平臺開發,自動按照使用者設定進行時間轉換
- SQLServer用函式實現對字串按照特定字元進行拆分SQLServer函式字串字元
- mysql 字串型別的數值欄位按照數值的大小進行排序MySql字串型別排序
- 記錄:git commit提交時沒有使用-m新增註釋進入了VIM模式的處理GitMIT模式
- golang gin框架進行時間運算之解決orm時間與時間運算——附原始碼Golang框架ORM原始碼
- MSSQL中按照日期來搜尋記錄.SQL
- nginx日誌按照天進行分割Nginx
- 使用Collections對list的內容進行排序排序
- Js比較對Object型別進行排序JSObject型別排序
- oracle 對錶中的記錄進行大批量刪除Oracle
- NTP系統時間同步-操作記錄
- 時間轉換,記錄一下