此表的 Oracle 11g 分区策略



数据库: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 是由预言机序列填充的自然数。
客户端 ID 是唯一的客户端标识符。
为了便于通过报告进行查询,我还创建了一个以下视图,该视图根据 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?
分区策略应该是什么?

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

您将无法从这种方式进行分区修剪中受益。如果您计划长时间存储数据,这将导致视图工作非常缓慢。

我建议将"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。

最新更新