此表的Oracle 11g分区策略

时间:2013-10-11 10:41:01

标签: sql oracle oracle11g

数据库: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?
什么应该是分区策略?

2 个答案:

答案 0 :(得分:0)

由于选择是在createdon上,我建议有一个范围分区,并且查询应该根据传递的日期引用正确的分区。

答案 1 :(得分:0)

您不会以这种方式从分区修剪中受益。如果您打算长时间存储数据,这将导致视图工作非常慢。

我建议在clients表或其他实体中存储“latestAuditTimestamp”或“lastAuditId”,并按以下步骤重新执行视图:

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

在后期阶段,您可以通过在客户端数量过高而使用HASH SEMI JOIN的情况下为最大/最小lastAuditTimstamp添加范围条件来进一步优化它。