数据库: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。