由ORA_ROWSCN想到的

在ORACLE10G中提供了一個新的功能,ORA_ROWSCN。ORACLE會在表中記錄每條記錄的最後的變化的SCN。
默認的情況下,每個塊中所有的記錄的ORA_ROWSCN都是相同的,當塊中任意一條記錄發生改變的情況下,塊中所有記錄的ORA_ROWSCN都會變化爲最新值,ORA_ROWSCN的最小粒度是塊。
當我們使用create table …… rowdependencies;建表的時候,每條記錄會有自己的ORA_ROWSCN段,在這種情況下塊內的一條記錄的更改僅僅會影響該記錄的ORA_ROWSCN,不會對塊內其他記錄的ORA_ROWSCN產生影響。這個時候,ORA_ROWSCN的最小粒度是記錄。
這個功能比較適合那些需要做增量刷新的操作,通過ORA_ROWSCN來迅速的找到那些發生變化的塊,忽略那些沒有發生變化的塊,提高了刷新的效率。
寫到這的時候,不知道大家有沒有想另外的一個問題,那就是ORA_ROWSCN是怎麼實現的,使用ORA_ROWSCN有什麼注意的事項麼?
這是我們大家共同的一個問題,僅僅注意到一個功能積極的部分,很少想這個功能是否適合我,使用這個功能會給系統帶來什麼樣子的風險,而往往風險纔是我們需要更多考慮的地方。在數據庫方面有一句話還是比較實在的,“無過便是功”。與系統的優化相比,系統的穩定則更加重要一些。
還是回到ORA_ROWSCN上來吧。
當我們沒有開啓rowdependencies的時候,塊內的所有記錄的ORA_ROWSCN都是一樣的,可以猜想oracle會直接讀取block head來獲得ORA_ROWSCN,因爲這樣做的話效率會高一些,也更加的方便直接。事實上,oracle也是這樣做的。所以在這種情況下,對於DML操作來說,並沒有增加任何的開銷,block head的scn是肯定要記錄的。因此,在默認情況下,使用ORA_ROWSCN並不會帶來任何的影響的。
那當我們開啓了rowdependencies呢?這個時候塊中的每條記錄都會有自己的ORA_ROWSCN了,那肯定是在塊中完整的記錄下每條記錄的scn號。這樣就帶了兩個需要考慮的問題,空間上會存在浪費,這部分空間用來記錄每條記錄的scn。當記錄的字段比較多,記錄的長度比較長的時候可能影響的百分比會小一些,可是對於那些字段比較少的,記錄的長度比較短的表影響將會是巨大的,空間的佔用完全有可能增大100%以上。對時間上的浪費也很好理解,在表上的DML操作會更新一個字段,時間的浪費也就是必然的了。
上面的分析僅僅是抽象的,還需要一些測試數據的支持。有時間話,我會做一個測試,看看到底會對空間和時間有多大的影響。
在論壇上經常會有朋友問,深入的學習oracle到底有沒有用?這句問題怎麼回答呢,還是那句話,在時間允許的情況下深入學習oracle的肯定是有好處的;在時間不允許的情況下,就要“適度”了,這個度到底是怎麼劃分呢。拿上面的例子來說吧,如果能知道ORA_ROWSCN的產生原理就應該是足夠了,這樣經過簡單的分析就可以知道ORA_ROWSCN的優點和缺點。
就寫到這吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章