0

我们每天在温度指标上收到数百万条记录。这些记录的大多数相关元数据按日期(月)保存在单个分区表中。我们将开始接收最多20个与此数据相关的个人代码。目的是最终允许通过这些代码进行搜索。在Oracle中设计一对多代码值的最佳方法

什么是最有效的方式来存储这些数据,以尽量减少搜索响应时间?数据库是Oracle 11gR2。

一些选项,我考虑到:

(1)创建一个主记录ID和代码值的单独的表。喜欢的东西

id  code 
--  ---- 
1  AA 
1  BB 
1  CC 
2  AA 
2  CC 
2  DD 

关注:

  • 很可能需要在代码列一个位图索引,但该表是高事务所以没有位图
  • 表将获得丰厚的一段时间多达20个每个主记录的代码

(2)创建一个由代码值分区的单独表格。

关注:

  • 分区维护新代码
  • 搜索性能

(3)XMLType列添加到现有的表,并为每个记录代码格式化成XML,并创建一个列上的XMLIndex:类似于:

<C1>AA</C1> 
<C2>BB</C2> 
<C3>CC</C3> 

问题:

  • 查询响应时间上的代码搜索时可能会很差

任何建议都欢迎。

谢谢。

+0

创建一个包含主记录ID和代码值的单独表格。代码上的索引对于查询来说性能足够好,而且不会减慢插入的速度。我假设在这张独立的桌子上不会有更新或删除。 –

+0

你的意思是说,在将来你想查询一个表来找到所有具有代码A或者不同的ID?一天最多可记录2000万条记录,数据量将变得非常快。 – Ben

回答

2

您需要对不同的方法进行基准测试。在没有更多了解您的情况的情况下,我们无法为您提供有意义的解决方案。总共有多少个不同的代码?每次读取的平均代码数是多少?代码分配会有明显的偏差吗?您需要通过code搜索哪些访问路径?

然后就是你如何加载数据(批次?滴灌饲料?)的问题。你从使用分区中得到什么好处。

无论如何。这里还有一个方法,就是你的(1)和(2)的合并。

鉴于您的主表是按月分区的,您应该用相同的方案对任何子表进行分区。您也可以通过code进行子分区。

create table main_codes 
    (reading_dt date not null 
     , main_id number not null 
     , code varchar2(2) 
     , constraint main_codes_pk primary key (code, reading_dt, main_id) using index local 
    ) 
partition by range (reading_dt) 
subpartition by list (code) 
subpartition template 
( 
    subpartition sp_aa values ('AA'), 
    subpartition sp_bb values ('BB'), 
    subpartition sp_cc values ('CC'), 
    subpartition sp_dd values ('DD') 
) 
(
    partition p_2015JAN values less than (date '2015-02-01'), 
    partition p_2015FEB values less than (date '2015-03-01'), 
    partition p_2015MAR values less than (date '2015-04-01') 
) 
/

您可能需要在主表的外太:

alter table main_codes 
    add constraint code_main_fk foreign key (reading_dt, main_id) 
    references main_table (reading_dt, main_id) 
/

create index code_main_idx on main_codes (entry_dt, id) local 
/

根据你的代码的数量,创建子分区模板可能是乏味的。这就是为什么大自然给了我们'切'的酱。

但无论你做什么,都不会沿着XML路径

+0

APC,非常感谢您的详细回复。 总共有20个左右的不同代码,未来可能会增加更多代码。代码应该均匀分布(即没有歪斜)。数据将以每天2-3百万条记录的大约20个代码进行滴灌,因此每天有40-60万条代码。 我们需要提供按代码自行搜索或按日期和代码搜索的功能。 对于这种性质的代码,位图显然是理想的解决方案,但这种表的高度事务性质是不可能的。 – Steve

+0

(续)。我正在考虑复合分区(按日期,然后是代码),但是如果用户只通过代码进行搜索,则会扫描所有分区。当然,这对日期和代码搜索很有效。不幸的是,这似乎是无论是分区替代还是22分。 我希望我能想出一个解决方案,可以在将来无需手动干预和/或停机(即分区维护)的情况下无缝地容纳任何新代码。 再次感谢您的洞察力。 顺便说一句,感谢APC很好地格式化我的原始帖子。 – Steve

相关问题