2016-07-22 42 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創建? –