2015-12-01 61 views
1

我正在使用的模式有少量客戶,每個客戶都有大量數據。Oracle按分區劃分ID和按DATE分區間隔

在確定分區策略時,我的第一個想法是按customer_id進行分區,然後按區間隔分配一個白天區間。但是,您不能在子分區中使用間隔。

最終,我希望能夠在創建新客戶時自動創建分區,同時還爲客戶數據創建自動日常子分區。所有應用程序查詢均在customer_id級別指定了各種日期範圍。

這個post幾乎是相同的,但答案涉及顛倒分區策略,我仍然想找到一種方法來完成範圍間隔分區。一種方法可能是每月的數據庫工作爲未來的日子/月份創建子分區,但這並不正確。

也許我錯了,我的假設是當前的數據結構將從範圍區間間隔分區策略中受益更多。我們有一些客戶的數據與其他客戶相差甚遠,所以我正在想辦法隔離客戶數據。

有關更好方法的任何想法/建議?

再次感謝您!

UPDATE

這裏是我提出的一個例子:

CREATE TABLE PART_TEST(
      CUSTOMER_ID NUMBER, 
      LAST_MODIFIED_DATE DATE 
     ) 
     PARTITION BY RANGE (CUSTOMER_ID) 
     INTERVAL (1) 
     SUBPARTITION BY RANGE (LAST_MODIFIED_DATE) 
     SUBPARTITION TEMPLATE 
     (
      SUBPARTITION subpart_1206_min values LESS THAN (TO_DATE('12/2006','MM/YYYY')), 
      SUBPARTITION subpart_0107 values LESS THAN (TO_DATE('01/2007','MM/YYYY')), 
      SUBPARTITION subpart_0207 values LESS THAN (TO_DATE('02/2007','MM/YYYY')), 
      ... 
      ... 
      ... 
      SUBPARTITION subpart_max values LESS THAN (MAXVALUE) 
     ) 
     (
     PARTITION part_1 VALUES LESS THAN (1) 
     ) 

我目前在模板290子分區。這似乎正在工作,除了一個障礙。在我的測試中我發現了比CUSTOMER_ID大於3615的任何記錄失敗ORA-14400:插入分區鍵沒有映射到任何分區

+0

根據[邏輯數據庫限制](https://docs.oracle.com/cloud/latest/db121/REFRN/refrn0043.htm#REFRN0043),最多可以有1'048'575個分區。你有290 * 3'615 = 1'048'350。我**真的**推薦你修改你的分區計劃!你在桌面上有多少條記錄?萬億? –

+0

謝謝Wernfried,最終我只期望大概2000個客戶,但在分區策略方面顯然過度。該數據庫是一個多租戶系統,我的目標是找到一種方法將每個客戶數據劃分爲多個部分以幫助提高性能等等,這是我在CUSTOMER_ID級別進行分區的原因,然後是按月/年進行分區劃分的原因。 – rcurrie

回答

1

,您可以撥打RANGE INTERVAL分區上的日期,然後LISTRANGE子分區上它。會是這樣:

CREATE TABLE MY_PART_TABLE 
(
    CUSTOMER_ID      NUMBER    NOT NULL, 
    THE_DATE     TIMESTAMP(0) NOT NULL, 
    OTHER_COLUMNS NUMBER 
) 
PARTITION BY RANGE (THE_DATE) INTERVAL (INTERVAL '1' MONTH) 
    SUBPARTITION BY RANGE (CUSTOMER_ID) 
     SUBPARTITION TEMPLATE (
     SUBPARTITION CUSTOMER_GROUP_1 VALUES LESS THAN (10), 
     SUBPARTITION CUSTOMER_GROUP_2 VALUES LESS THAN (20), 
     SUBPARTITION CUSTOMER_GROUP_3 VALUES LESS THAN (30), 
     SUBPARTITION CUSTOMER_GROUP_4 VALUES LESS THAN (40), 
     SUBPARTITION CUSTOMER_GROUP_5 VALUES LESS THAN (MAXVALUE) 
     ) 
(PARTITION VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00')); 



CREATE TABLE MY_PART_TABLE 
(
    CUSTOMER_ID      NUMBER    NOT NULL, 
    THE_DATE     TIMESTAMP(0) NOT NULL, 
    OTHER_COLUMNS NUMBER 
) 
PARTITION BY RANGE (THE_DATE) INTERVAL (INTERVAL '1' MONTH) 
    SUBPARTITION BY LIST (CUSTOMER_ID) 
     SUBPARTITION TEMPLATE (
     SUBPARTITION CUSTOMER_1 VALUES (1), 
     SUBPARTITION CUSTOMER_2 VALUES (2), 
     SUBPARTITION CUSTOMER_3_to_6 VALUES (3,4,5,6), 
     SUBPARTITION CUSTOMER_7 VALUES (7) 
     ) 
(PARTITION VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00')); 

注意,對於客戶的第二溶液中的數量(即ID的)是修復。如果您獲得新客戶,則必須更改表格並相應地修改SUBPARTITION TEMPLATE。

每當插入或更新新值時,Oracle將自動創建每月分區。

+0

謝謝。這與我在上面發佈的鏈接中的解決方案類似。然而,我認爲這還不是我所掌握的數據。我寧願找到一個主要在CUSTOMER_ID上進行分區,然後在DAY上進行子分區的解決方案。最有可能我會有一個子分區模板多個月等。 – rcurrie

+0

我不建議這樣做,你會失去INTERVAL分區的強大功能,Oracle會在需要時自動創建新分區(包括子分區)。 –

+0

我還在計劃在CUSTOMER_ID上使用INTERVAL(1)和子分區模板進行間隔分區。這樣,每次創建新客戶時,都會創建一個新的分區,並且還會創建幾個月的子分區。我可以用這個示例更新問題... – rcurrie