【问题标题】:Oracle 11g Partitioning Strategy for this table此表的 Oracle 11g 分区策略
【发布时间】:2013-10-11 10:41:01
【问题描述】:

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

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-03-30
        • 2013-07-14
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 2018-10-10
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        相关资源
        最近更新 更多