2013-10-11 61 views
1

數據庫:Oracle 11gOracle 11g此表的分區策略

我正在開發一個新建項目並設計數據庫模式。我有一個審計表,顧名思義, 最終將成長爲擁有大量記錄。以下是表定義(修剪無關列後)。

create table ClientAudit (
    id    number(19,0) primary key, 
    clientId   number(19,0) not null, 
    createdOn   timestamp with time zone default systimestamp not null 
); 

id是由oracle序列填充的自然數。
clientId是一個唯一的客戶端標識符。
爲了便於查詢的報告,我創建一個下面的視圖爲好,這給基於createdOn爲每個客戶端的最新記錄,:

create or replace view ClientAuditView 
as 
select * from (
    select ca.*,max(ca.createdOn) keep (dense_rank last order by ca.createdOn) 
     over (partition by ca.clientId) maxCreatedOn 
     from ClientAudit ca 
) 
where createdOn=maxCreatedOn; 
/

我不知道什麼應該在這裏,如果分區鍵我將分區ClientAudit表。
它應該是ClientId還是CreatedOn?
什麼應該是分區策略?

回答

0

由於選擇是在創建的,我會建議有一個範圍分區,並且查詢應該引用基於傳遞日期的正確分區。

0

這樣你就不會從分區修剪中受益。如果您打算長時間存儲數據,這會導致視圖工作非常緩慢。

我推薦存儲「latestAuditTimestamp」或「lastAuditId」在客戶表或其他實體,並重新做圖如下:

create or replace view ClientAuditView 
as 
select ca.* from ClientAudit ca 
where (clientId,createdOn) in (select clientId,lastAuditTimestamp from Clients c) 
; 
/

在後期可以更優化它,通過增加如果客戶端數量過高,則使用最大/最小lastAuditTimstamp的範圍條件,並使用HASH SEMI JOIN。