oracle时间戳效率问题,时间戳问题 - Oracle开发 - ITPUB论坛-中国专业的IT技术社区...
需要修改的是那個(gè)“另外數(shù)據(jù)交換程序”,它不能把本次的SYSDATE記錄下來(lái)作為下次抽取的起點(diǎn),應(yīng)該去V$TRANSACTION里面找最小的START_TIME, 找不到才用SYSDATE。
TOM"Oracle 9i 10g編程藝術(shù)":
7.3.1 一種會(huì)失敗的常用數(shù)據(jù)倉(cāng)庫(kù)技術(shù)
我看到,許多人都喜歡用這樣一種常用的數(shù)據(jù)倉(cāng)庫(kù)技術(shù):
(1) 他們使用一個(gè)觸發(fā)器維護(hù)源表中的一個(gè) LAST_UPDATED 列,這與上一章的 6.2.3 節(jié)中討論的
方法很相似。
(2) 最初要填充數(shù)據(jù)倉(cāng)庫(kù)表時(shí),他們要記住當(dāng)前的時(shí)間,為此會(huì)選擇源系統(tǒng)上的 SYSDATE。例
如,假設(shè)現(xiàn)在剛好是上午 9:00。 ------------------ 此處就是引起漏洞的原因,需要修改
(3) 然后他們從事務(wù)系統(tǒng)中拉(pull)出所有行,這是一個(gè)完整的 SELECT * FROM TABLE 查詢(xún),
可以得到最初填充的數(shù)據(jù)倉(cāng)庫(kù)。
(4) 要刷新這個(gè)數(shù)據(jù)倉(cāng)庫(kù),他們要再次記住現(xiàn)在的時(shí)間。例如,假設(shè)已經(jīng)過(guò)去了 1 個(gè)小時(shí),現(xiàn)
在源系統(tǒng)上的時(shí)間就是 10:00.他們會(huì)記住這一點(diǎn)。然后拉出自上午 9:00 (也就是第一次拉出
數(shù)據(jù)之前的那個(gè)時(shí)刻)以來(lái)修改過(guò)的所有記錄,并把這些修改合并到數(shù)據(jù)倉(cāng)庫(kù)中。
注意 這種技術(shù)可能會(huì)在兩次連續(xù)的刷新中將相同的記錄 “拉出”兩次。由于時(shí)鐘的粒度所致,這是不可
避免的。MERGE 操作不會(huì)受此影響(即更新數(shù)據(jù)倉(cāng)庫(kù)中現(xiàn)有的記錄,或插入一個(gè)新記錄)。
他 們相信,現(xiàn)在數(shù)據(jù)倉(cāng)庫(kù)中有了自第一次執(zhí)行拉出操作以來(lái)所修改的所有記錄。他們確實(shí)可能有所
有記錄,但是也有可能不是這樣。對(duì)于其他采用鎖定系統(tǒng)的數(shù)據(jù)庫(kù)來(lái) 說(shuō),這種技術(shù)確實(shí)能很好地工作, 在
這些數(shù)據(jù)庫(kù)中讀會(huì)被寫(xiě)阻塞,反之寫(xiě)也會(huì)被讀阻塞。但是在默認(rèn)支持非阻塞讀的系統(tǒng)中,這個(gè)邏輯是有問(wèn)
題的。
要看這個(gè)例子有什么問(wèn)題,只需假設(shè)上午 9:00 至少有一個(gè)打開(kāi)的未提交事務(wù)。例如,假設(shè)在上午
8:59:30 時(shí),這個(gè)事務(wù)已經(jīng)更新了表中我們想復(fù)制的一行。在上午 9:00, 開(kāi)始拉數(shù)據(jù)時(shí),會(huì)讀取這個(gè)表中
的數(shù)據(jù),但是我們看不到對(duì)這一行做的修改;只能看到它的最后一個(gè)已提交的版本。如果在查詢(xún)中到達(dá)這
一行時(shí)它已經(jīng)鎖定,我們就 會(huì)繞過(guò)這個(gè)鎖。如果在到達(dá)它之前事務(wù)已經(jīng)提交,我們還是會(huì)繞過(guò)它讀取查詢(xún)
開(kāi)始時(shí)的數(shù)據(jù),因?yàn)樽x一致性只允許我們讀取語(yǔ)句開(kāi)始時(shí)數(shù)據(jù)庫(kù)中已經(jīng)提交的數(shù)據(jù)。在 上午 9:00 第一次
拉數(shù)據(jù)期間我們讀不到這一行的新版本,在上午 10:00 刷新期間也讀不到這個(gè)修改過(guò)的行。為什么呢?上
午 10:00 的刷新只會(huì)拉出自那天早上上午 9:00 以后修改的記錄,但是這個(gè)記錄是在上午 8:59:30 時(shí)修改的 ,
我們永遠(yuǎn)也拉不到這個(gè)已修改的記錄。
在許多其他的數(shù)據(jù)庫(kù)中,其中讀會(huì)被寫(xiě)阻塞,可以完成已提交但不一致的讀,那么這個(gè)刷新過(guò)程就能
很好地工作。如果上午 9:00(第一次拉數(shù)據(jù)時(shí))我們到達(dá)這一行,它已經(jīng)上鎖,我們就會(huì)阻塞,等待這一
行可用,然后讀取已提交的版本。如果這一行未鎖定,那么只需讀取就行,因?yàn)樗鼈兌际且烟峤坏摹?/p>
那么,這是否意味著前面的邏輯就根本不能用呢?也不是,這只是說(shuō)明我們需要用稍微不同的方式來(lái)
得到 “現(xiàn)在”的時(shí)間。應(yīng)該查詢(xún) V$TRANSACTION,找出最早的當(dāng)前時(shí)間是什么,以及這個(gè)視圖中 START_TIME
列記錄的時(shí)間。我們需要拉出自最老事務(wù)開(kāi)始時(shí)間(如果沒(méi)有活動(dòng)事務(wù),則取當(dāng)前的 SYSDATE 值)以來(lái)經(jīng)
過(guò)修改的所有記錄:
select nvl( min(to_date(start_time,'mm/dd/rr hh24:mi:ss')),sysdate)
from v$transaction;
在這個(gè)例子中,這就是上午 8:59:30,即修改這一行的事務(wù)開(kāi)始的那個(gè)時(shí)間。我們?cè)谏衔?10:00 刷新
數(shù)據(jù)時(shí),會(huì)拉出自那個(gè)時(shí)間以來(lái)發(fā)生的所有修改,把這些修改合并到數(shù)據(jù)倉(cāng)庫(kù)中,這就能得到需要的所有
東西。
總結(jié)
以上是生活随笔為你收集整理的oracle时间戳效率问题,时间戳问题 - Oracle开发 - ITPUB论坛-中国专业的IT技术社区...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小程序采用mvvm设计模式_滴滴重磅开源
- 下一篇: 信息学奥赛一本通 2048:【例5.18