数据库: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?
什么应该是分区策略?
答案 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添加范围条件来进一步优化它。