1

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

4

2 回答 2

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。

于 2013-10-19T19:08:00.010 回答
0

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

于 2013-10-11T10:49:37.607 回答