2010-01-22 71 views
1

不知道,如果主題完全傳達我想要實現的,但讓我解釋一下:Oracle數據版本/分區策略/最佳實踐

我們正在構建一個使用Oracle作爲存儲後端的應用程序。每年,去年的數據集將被「歸檔」,並從頭開始創建和填充新的實例。 在同一模式下做什麼選擇?

  1. 保持版本信息在記錄級別上(我們認爲這對我們的用例來說太慢了)。
  2. 將版本信息保留在表級別,因此對於每個新版本,我們將重新創建所有表格,但使用新版本前綴。 (我們喜歡這個解決方案,因爲我們可以在代碼中完成)。

是不是有像分區/個性/命名空間可以讓我們在Oracle中實現這個功能?

我的oracle經驗相當有限,任何幫助將不勝感激!

+0

數據存檔後,您是否需要訪問它?你會報告一個綜合的多年期數據集嗎? – 2010-01-22 09:46:41

+0

是的,他們的數據有時仍會被訪問(並寫入)。 – twiga 2010-01-22 10:04:09

+0

這聽起來像你只需要將「YEAR」作爲表格設計中的一個關鍵字。會不會有一些表不會被清除,例如CUSTOMER表? – 2010-01-23 00:25:10

回答

1

RDBMS概念模型在維護時間版本的數據方面不是很好。所以這不僅僅是Oracle在這方面缺乏的。

我不清楚爲什麼你認爲將版本信息保持在記錄級別會太慢。創建新版本太慢了?或者在正常運營中的數據檢索方面太慢?

這裏是你如何做到這一點。給定一個表的客戶CUSTOMER_REF的業務重點,我可能正常地構建像這樣(我用縮寫語法,而不是最佳實踐空間的原因):

create table customers 
(id number not null primary key 
    , customer_ref number not null unique key 
    , name varchar2(30) not null) 
/

的版本相當於是這樣的:

create table customers 
(id number not null primary key 
    , customer_ref number not null 
    , version_number number 
    , name varchar2(30) not null 
    , constraint whatever unique (customer_ref, version_number)) 
/

這可以通過保持當前版本的VERSION_NUMBER爲空並僅在存檔時填充它來實現。任何查找將不得不包括and version_number is null。這會有點痛苦,你可能需要在你構建的任何附加索引中包含列。

顯然,在同一個表中維護所有版本的記錄會增加表的大小,這可能會影響性能。 Oracle的分區選項在這裏絕對有幫助。它還會爲您創建明年的數據集提供一種簡潔的方式。但是,它是企業許可證之外的額外費用,因此這是一個昂貴的選擇。 Find out more.

這最耗時的方面將是管理新版本表中的外鍵關係。假定您選擇使用合成主鍵,那麼歸檔過程必須生成新的ID,然後將它們艱苦地級聯到引用外鍵的新版本中的依賴記錄。

考慮到這一點,每個版本的謹慎表格看起來都非常有吸引力。爲了方便使用,我會保持目前的版本未加前綴,使歸檔成爲

create table customers_n as select * from customers; 

一個簡單的過程,您可能希望避免的停機時間,同時創建版本表。在這種情況下,您可以使用實例化視圖在啓動歸檔切換期間捕獲表的狀態。當時鍾打到十二點時,您可以關閉刷新。 (警告:這是在飛思維,我從來沒有做過這樣的事情,所以在購買之前嘗試。)

多個表(和分區)的一個相關優點是您可以將存檔記錄移動到只讀表空間。這不僅可以防止意外更改,還可以將其排除在後續備份之外。

編輯

我注意到你有評論說,歸檔數據可以occasionbally進行修正。在將它移動到READ ONLY表空間的情況下不是更好的選擇。

+0

>>我不清楚爲什麼你認爲版本信息保持在 >>記錄級別太慢。創建新的 >>版本太慢? >>或者在經常運行 >>操作時涉及到數據檢索太慢? 在定期的復興行動中速度太慢,但我必須說,我認爲太慢是基於沒有事實,完全是直覺。 我們正在調查客戶端以確定他們是否具有分區選項,否則我們將採用表版本控制策略。 感謝您的輸入,非常感謝! – twiga 2010-01-22 10:03:29

0

我唯一要做的就是添加APC所說的關於您要求的「名稱空間」。

Oracle中的命名空間是一個架構,您可以在每個架構中擁有相同的對象名稱。

當然,這一切都取決於您的應用程序必須如何訪問多個版本,但我會傾向於每年不同的架構,然後纔會使用某種命名約定來維護同一架構中的表的版本。原因是,最終你會有噩夢。至少在不同模式下,所有的DDL都可以是相同的,對象的所有引用都是相同的,像ER模型和查詢工具這樣的工具將在該模式的上下文中工作。數據模型發生了變化,所以在某些時候,您可能需要運行一些比較工具,並且如果您的所有表都使用某種版本的postfix命名爲funky,那麼這樣做效果不佳。

使用fromuser/touser或remap_schema選項可以快速複製/移動使用導出或數據泵的模式,因此您不需要太多代碼,只需要對新版本中的上一年數據進行任何清理。

我發現模式作爲「容器」是非常有用的,我主持的大多數應用程序只具有模式級特權,所以我保證應用程序可以輕鬆快速地從實例移動到實例,或者應用程序的多個副本可以並行託管在同一個實例上。

0

可能會在多年之間改變模式。例如,2010年你有15列,但在2011年,你增加了16列。 如果是這樣,那麼同一個應用程序是否可以同時處理2010年和2011年的數據。

如果模式是靜態的,我會選擇'YEAR'列並使用VPD/RLS/FGAC來應用YEAR ='2010'謂詞。

如果性能出現問題,我只會擔心分區問題。

-1

1)時間間隔按年份和行中的某個日期字段分區。

2)將它添加到每個表的末尾,並使用序列和觸發器填充它。

3)然後在該列上按時間間隔分區。