2013-10-11 42 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。