簡體   English   中英

該表的Oracle 11g分區策略

[英]Oracle 11g Partitioning Strategy for this table

數據庫:Oracle 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?
分區策略應該是什么?

由於選擇是在createdon上進行的,因此我建議您有一個范圍分區,並且查詢還應根據傳遞的日期引用正確的分區。

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

我建議在客戶表或其他實體中存儲“ 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM