2016-07-22 40 views
5

案例我应该对表格进行分区/子分区吗?

  1. 该系统具有dispositives,基本上由id, type, name形成。
  2. 我可能有N dispositives
  3. 我有一张桌子来存储所有dispositiveslog。这是系统中最大的桌子。 (现计算100公里记录)
  4. log表中有:id_dispositive, date, status

问题

显然,这是导致性能问题这个庞大的数据。我必须保存至少两个月登录值..

今天我有这个dispositives通过type

TYPE  COUNT 
--------------- 
1   78956 
2   125161 
3   13213 
4   6112 
5   25426 
6   12314 
7   1241 
8   622 

我也有一些业务逻辑来养活这个log表。不管怎么说,这是我的想法:

我的“解决方案”

我在分区想这log表。这里是问题:

  1. 它值得吗?
  2. 我应该按类型分区吗?
  3. 我应该按类型和子分区按DATE进行分区吗?
  4. 我可以通过编程的方式吗?

由于这些类型是动态的,用户可以删除/插入新的类型。

因此,如果他们删除某种类型,我必须删除该类型的所有日志。 就像他们插入某种类型一样,我必须注册(存储)该类型的所有日志。

根据编辑弗朗西斯塞拉的答案

我想创建这样的表:

create table log(
     id_dispositive number, 
     type  number, 
     date_verification date, 
     status number 
) 
partition by range (date_verification) 
subpartition by list (type) 
subpartition TEMPLATE (
    SUBPARTITION type1 VALUES (1), 
    SUBPARTITION type2 VALUES (2), 
    SUBPARTITION type3 VALUES (3), 
    SUBPARTITION type4 VALUES (4) 
)(       
interval (numtoyminterval(1,'MONTH'))(
    partition p0816 values less than (to_date('01/09/2016','dd/mm/yyyy')) 
)); 

和我越来越:

ORA-14004: PARTITION keyword not found. 
+0

如果不是日志表的一部分,你将如何按类型进行分区? 如果您按日期访问,您至少应该尝试按日期进行分区。使用DBMS_REDEFINITION分区表以最大限度地减少停机时间。 – vercelli

+0

嗯,它有'id_dispositive'。我可以得到它的类型...像分区所有类型X的ID? –

+0

您可以在编号列上创建自动分区(如果分区不存在,则在新分区中可能会添加新行)。您可以使用模板添加子分区。告诉我你是否对这个解决方案感兴趣。 –

回答

1

你可以尝试这样:使用INTERVAL告诉oracle创建自动分区。您必须定义列(数字或日期)和间隔(在我的示例中为1个月)。 Oracle将以相同的时间间隔(在本例中为同一个月)将所有行放入同一分区。如果该分区不存在将被创建。

create table log(
     id_dispositive number, 
     date date, 
     status number, 
     type number 
) 
partition by range (date)        
interval (numtoyminterval(1,'MONTH'))(
    partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd')) 
); 

类型栏也可以做同样的事情。更多信息:http://www.oracle.com/technetwork/articles/sql/11g-partitioning-084209.html

每个分区都可以使用TEMPLATE键进行子分区。

create table log(
     id_dispositive number, 
     date date, 
     status number, 
     type number 
) 
partition by range (date) interval (numtoyminterval(1,'MONTH')) 
subpartition by list (type) 
subpartition TEMPLATE (
    SUBPARTITION types1 VALUES (1, 2) TABLESPACE tbs_1, 
    SUBPARTITION types2 VALUES (3, 4) TABLESPACE tbs_1 
)       
(
    partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd')) 
); 

在这种情况下,你不能创建一个自动子分区,如果一个新的类型将是添加你必须运行ALTER TABLE statment。这里有更多的信息; https://docs.oracle.com/cd/B28359_01/server.111/b32024/part_admin.htm#i1006655

在您的例子:

create table prova_log(
     id_dispositive number, 
     type  number, 
     date_verification date, 
     status number 
) 
partition by range (date_verification) interval (numtoyminterval(1,'MONTH')) 
subpartition by list (type) 
subpartition TEMPLATE (
    SUBPARTITION type1 VALUES (1), 
    SUBPARTITION type2 VALUES (2), 
    SUBPARTITION type3 VALUES (3), 
    SUBPARTITION type4 VALUES (4) 
)       
(
    partition p0816 values less than (to_date('01/09/2016','dd/mm/yyyy')) 
); 

如果您尝试插入:

insert into prova_log values (1,1,TO_DATE('10/10/2016','dd/mm/yyyy'),1); 

,你会看到你的表2分区。

现在我已经测试过了!

+0

什么是动态插入? –

+0

对不起,我不明白你的问题。无论如何:当您在表中插入一个新行Oracle将它放在正确的分区/子分区中时,如果分区不存在,它将被创建。 –

+0

如果我想为每种类型创建子分区,该怎么办?我可以通过编程来做到吗?不知怎的,如果子分区不存在,oracle创建? –