2011-10-18 89 views
1

我有一個相對較大的表(~100m記錄),它基本上是一個XML存儲。可以有多個具有不同時間戳的XML文檔(使用最新時間戳=最新版本的邏輯)。我們期待每月批量的更新數據,可能會使用約70%數據的新版本。我們正在計劃只保留商店中最新的2-3個版本,所以我猜測我們當前的B樹索引(記錄ID,時間戳)不一定是最快的?一個直接的「選擇*從表中的時間戳」= YYYY-MM-DD順序記錄ID,時間戳「查詢需要15小時才能完成昨晚 - 相當高規格的工具包,我不認爲其他人正在使用DB當時。Oracle複合鍵自動遞增(減量!?)

(re:查詢本身,理想情況下,我只想選擇時間戳大於或等於yyyy-mm-dd的最新文檔,但目前這不是問題)。

有什麼辦法,我可以創建一個自動遞減列如下:

Record ID Timestamp Version XML 
1   2011-10-18 1   <...> 
1   2011-10-11 2   <...> 
1   2011-10-04 3   <...> 
2   2011-10-18 1   <...> 
2   2011-10-11 2   <...> 

等等等等 - 即作爲一個新的版本出現時,最近的時間戳= 1版,和所有舊的記錄得到版本=版本+ 1.這樣我的管家腳本可以是一個簡單的「刪除版本> 3」(或者我們決定保留的任何東西),並且我可以在記錄ID上有一個B樹索引,並在版本上的二進制索引?

希望我沒有完全找錯了樹 - 已經「創造性谷歌搜索」整個上午,這是理論,我拿出...

+0

每個月的批次可以達到約7000萬行。但每日批次約達250萬行。如果甚至有可能獲得每日批次,那可能值得考慮。 –

+0

不可能 - 這是一個源頭驅動的決定。但它有其好處 - 這意味着這些表格幾乎每天都有空閒,數據被插入到這些表格中,每個月有一天,最新數據被提取並傳遞到前端系統。因此,插入/更新沒有(實際)時間限制,但選擇(和後續處理)有一個〜72小時的窗口,其中選擇當前需要15個小時... – Andy

回答

0

我不知道遞減版本將是一個好主意。唯一的方法是使用觸發器查找匹配的記錄ID並相應地更新它們。這對性能來說不是很好..

這就是我在我們的數據庫環境(這是一個相似的大小)做類似的事情。希望它有用:

創建一個獨立的歸檔表,將保存所有版本的記錄。這將通過插入到主表的觸發器來填充。觸發器將insert記錄的當前版本存入您的存檔,並在主表上記錄update,增加版本號並更新時間戳和數據。

然後,當你只需要選擇最新版本的所有記錄,你只需要做:

SELECT * FROM TABLE; 

如果您需要查看的數據如何看待在給定的點「快照」的能力時間,您還需要在表上使用valid_fromvalid_to列來記錄每個版本的記錄是最新版本的時間。當您寫入歸檔表時,您可以使用觸發器填充這些文件。

Valid_to關於最新版本的記錄可以設置爲可用的最大日期。插入更新版本的記錄時,您會將之前版本的valid_to更新爲新記錄的valid_from之前(與避免愚蠢的情況不同)。

然後,當你想看到你的數據如何看待在給定時間,您查詢日存檔表使用SQL這樣的:

SELECT * 
FROM ARCHIVE_TABLE a 
WHERE <time you're interested in> BETWEEN a.valid_from AND a.valid_to 
0

批處理工作比典型的插入/更新的辦法肯定不同(ESP如果涉及觸發器或許多索引)。即使使用體面的磁盤/硬件,您也會發現傳統的DML方法在本捲上非常慢。對於那些你在批次每個月更新70毫米100毫米+表,我會建議尋找到類似的方法:

  1. 加載新的批處理文件(70毫米)到不同的表(NEW_XML),相同的格式爲現有的表(EXISTING_XML)。使用nologging來避免撤消。

  2. 從EXISTING_XML追加NEW_XML中不存在的記錄(30mm記錄,基於您已經使用的任何關鍵字)。

  3. 重命名EXISTING_XML到HISTORY_XML和NEW_XML到EXISTING_XML。在這裏,您需要一些停機時間,也許在一個週末休息幾小時。這不會花費任何時間,但是您需要時間進行下一步(並且由於對象失效)。如果您上個月已經有HISTORY_XML,請先截斷並放下它(保留1個月的舊數據)。

  4. 建立索引,統計,約束等因素對EXISTING_XML(現在包括新的數據也一樣)。重新編譯任何無效的對象,使用記錄等

所以,簡而言之,你就會有一個表(EXISTING_XML),不僅有新的數據,但建相對較快(數倍於DML快/觸發器方法)。另外,如果需要,您可以嘗試使用並行進行步驟2。

希望有所幫助。