2011-12-27 41 views
2

我有必須被劃分成宿舍,每年從2009年到2013年TimeData表,並沒有爲今後幾年表分區,哪個更好?

我做了2種方法:

CREATE TABLE TimeData (
id  NUMBER PRIMARY KEY NOT NULL, 
day_name varchar(45), 
day  NUMBER(2), 
month NUMBER(2), 
quart NUMBER(1), 
year NUMBER(4) 
) 

PARTITION BY LIST (year) 
SUBPARTITION BY LIST (quart) 
(
    SUBPARTITION q1 values (1), 
    SUBPARTITION q2 values (2), 
    SUBPARTITION q3 values (3), 
    SUBPARTITION q2 values (4) 
) 
    (
SUBPARTITION y_09 VALUES (2009), 
SUBPARTITION y_10 VALUES (2010), 
SUBPARTITION y_11 VALUES (2011), 
SUBPARTITION y_12 VALUES (2012), 
SUBPARTITION other VALUES (DEFAULT), 
) ; 
CREATE TABLE TimeData (
id  NUMBER PRIMARY KEY NOT NULL, 
day_name varchar(45), 
day  NUMBER(2), 
month NUMBER(2), 
year NUMBER(4) 
) 

PARTITION BY LIST (year) 
SUBPARTITION BY RANGE (month) 
(
    SUBPARTITION q1 values less than(4), 
    SUBPARTITION q2 values less than(7), 
    SUBPARTITION q3 values less than(10), 
    SUBPARTITION q2 values less than(13) 
) 
(
SUBPARTITION y_09 VALUES (2009), 
SUBPARTITION y_10 VALUES (2010), 
SUBPARTITION y_11 VALUES (2011), 
SUBPARTITION y_12 VALUES (2012), 
SUBPARTITION other VALUES (DEFAULT), 
); 

兩種方法在2012年後保持分區,我無法弄清楚如何克服這個問題
但問題是,'quart'字段是否使它更好?少計算也許
或沒有它,更少的存儲?!

**更新
第三位的方法只是突然出現在我的頭上,就是有16個分區(4個季度* 4歲)以及17分區值小於(MAXVALUE)..這樣我可以在來的永遠劃分的東西,對吧?

+1

爲什麼要在某個點後停止分區?我會假設你將來仍然會遇到數據集大小問題。也許宿舍應該有意見(或許)?我認爲分區的意義在於,表格可以像平常一樣進行訪問,即使它在物理上分裂了...... – 2011-12-27 21:05:23

回答

3

這已經有一段時間,因爲我使用分區工作,所以藉此與一粒鹽...

如果真的是你以後處理的16周固定的分區,沒有的情況下,只有你希望這些16個分區,從不越多,那麼可以簡單地使用範圍分區,其中第一季度延伸到剛開始的時候和最後一個季度結束的時間(用自己的故障更換日期):

PARTITION BY RANGE (date) 
    (PARTITION p2009_q1 VALUES LESS THAN (TO_DATE('2009-04-01', 'YYYY-MM-DD')), 
    PARTITION p2009_q2 VALUES LESS THAN (TO_DATE('2009-07-01', 'YYYY-MM-DD')), 
    PARTITION p2009_q3 VALUES LESS THAN (TO_DATE('2009-10-01', 'YYYY-MM-DD')), 
    PARTITION p2009_q4 VALUES LESS THAN (TO_DATE('2010-01-01', 'YYYY-MM-DD')), 
    PARTITION p2010_q1 VALUES LESS THAN (TO_DATE('2010-04-01', 'YYYY-MM-DD')), 
    ... 
    PARTITION p2013_q3 VALUES LESS THAN (TO_DATE('2014-09-01', 'YYYY-MM-DD')), 
    PARTITION p2013_q4 VALUES LESS THAN MAXVALUE) 

或者你可以散列成16個桶。

現在爲旁邊。立即想到的問題:

  • 爲什麼需要按季度進行分區?
  • 爲什麼需要進行子分區?
  • 爲什麼只到2013? (之後會發生什麼?)
  • 2013年之後,舊數據/分區會發生什麼?
  • 初始加載後,會不會將新記錄添加到「當前日期」分區?
  • 我們期望每個分區有什麼樣的數據量?

分區是一個物理屬性,它將被數據使用所驅動。從我的角度來看,分區granulatiry通常由數據大小和歸檔要求驅動。例如,如果每天捕獲一百萬行日誌數據,我可能會按天劃分分區,定期爲即將到來的日期預先創建分區,並將舊日更改爲只讀。數據可能僅在一週之後纔有用,最後一個分區可以被丟棄或歸檔。然後我們有一個分區的移動窗口。但是,如果我每週只能獲得10,000條記錄,那麼我只需創建一個每週分區的滾動窗口。並不是說我真的只需要一個分區的數據,但是因爲它使我能夠輕鬆地按照數據保留要求將一週以上的數據(通過分區)歸檔/歸檔。最終用戶可以按日或按小時或其他方式查看數據。

因此,如果每季度都在查看數據,並不意味着每月都不能對其進行分區。嘗試選擇一種方案,如果您能預測到需求即將到來,您可以稍後更輕鬆地添加分區。例如,使用範圍分區,當他們在一兩年內要求時,可以開始分割頂部分區。

哦,順便說一句,如果你以一種很好的可排序方式命名你的分區(YYYY MM DD ...),編寫一個動態sql腳本變得非常容易,以「alter table add分區「並查看分區創建(如果尚未添加該功能)。記住這一點,上面的第一個和最後一個分區應該有點不同。

+0

需要澄清的一點是:您無法使分區變成只讀;您可以使唯讀對象是一個表空間。 – 2012-01-03 16:01:59

0

@Glen有很多好主意,但如果您打算進行更重要的重新設計,您可能需要考慮使用單個日期列和間隔分區。

create table TimeData 
(
    id number primary key, 
    the_date date 
) 
partition by range(the_date) 
interval (numToYMInterval(3, 'month')) 
(
    partition first_partition values less than (date '0001-01-01') 
); 

使用一個日期列,而不是有多個號碼和VARCHAR列有幾個顯著優點:

  • 用途顯著較少的存儲
  • 刪除許多潛在的數據問題
  • 提供了更多的有用信息到優化器
  • 簡化許多查詢(您需要熟悉Oracle日期函數和格式,但不需要重新查詢建立日期)

區間劃分可以顯着提高maneagability;你永遠不需要擔心預先創建新的分區。