簡體   English   中英

Oracle 分區按 ID 和按 DATE 的子分區和間隔

[英]Oracle Partition by ID and subpartition by DATE with interval

我正在處理的模式有少量客戶,每個客戶有大量數據。

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

最終,我想要一種在創建新客戶時自動為新客戶創建分區的方法,並且還為客戶的數據創建每日自動子分區。 所有應用程序查詢都在 customer_id 級別,並指定了各種日期范圍。

這篇文章幾乎相同,但答案涉及反轉分區策略,我仍然想找到一種方法來完成范圍-范圍間隔分區。 一種方法可能是讓每月的數據庫作業為未來的幾天/幾個月創建子分區,但這感覺不對。

也許我的假設是錯誤的,即當前的數據結構將從范圍-范圍間隔分區策略中受益更多。 我們有一些客戶的數據使其他客戶相形見絀,所以我在考慮隔離客戶數據的方法。

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

再次感謝你!

更新

這是我提出的一個例子:

    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 失敗:插入的分區鍵未映射到任何分區

您可以在日期上創建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 都會自動創建每月分區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM