我正在爲我的應用程序構建一個數據庫存儲過程,該應用程序由具有大量數據量(數億條記錄)的單個表組成。我計劃在日期字段上設置索引,因爲我會在給定時間段內對所有記錄進行批量恢復(例如,在第二天的午夜時間檢索所有記錄)。Oracle中的動態表分區
由於記錄數量巨大,性能是該系統中的一個重要問題,我想知道是否有辦法動態分區我的表,以便更快地檢索記錄,創建和截斷分區因爲它們不再需要。例如,我將如何在第二天創建分區並在處理完今天的記錄之後使用其餘數據填充該分區?
我正在爲我的應用程序構建一個數據庫存儲過程,該應用程序由具有大量數據量(數億條記錄)的單個表組成。我計劃在日期字段上設置索引,因爲我會在給定時間段內對所有記錄進行批量恢復(例如,在第二天的午夜時間檢索所有記錄)。Oracle中的動態表分區
由於記錄數量巨大,性能是該系統中的一個重要問題,我想知道是否有辦法動態分區我的表,以便更快地檢索記錄,創建和截斷分區因爲它們不再需要。例如,我將如何在第二天創建分區並在處理完今天的記錄之後使用其餘數據填充該分區?
您可以通過使用dynamic SQL自動創建或截斷分區的過程。您可以使用EXECUTE IMMEDIATE或DBMS_SQL
編寫過程,並且您可以使用DBMS_JOB
或DBMS_SCHEDULER
(DBMS_SCHEDULER
是一個10g功能並且比DBMS_JOB
更通用)來安排它們。
您可能希望先手動構建分區語句,然後在您對DDL有信心時自動執行該過程。您將在documentation for the ALTER TABLE statement中找到所有合成物。
在11g中,我們可以定義INTERVAL分區,當Oracle獲得新的記錄時,它們的鍵不符合任何現有的範圍,Oracle會自動創建新的分區。這是一個非常酷的功能。 Find out more。
有一點需要記住的是,分區是在Enterprise Edition許可證之上的一項收費標準。所以使用起來並不便宜。
下面是我使用SYSDATE
和偏移量創建分區的一些示例。我必須創建一個字符串連接到SYSDATE
替換參數:
COLUMN temp_var new_value partition_name_01;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 3, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_01;
SELECT TO_CHAR(SYSDATE - 3, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_02;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 2, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_02;
SELECT TO_CHAR(SYSDATE - 2, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_03;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 1, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_03;
SELECT TO_CHAR(SYSDATE - 1, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_04;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_04;
SELECT TO_CHAR(SYSDATE, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
CREATE TABLE TABLE_NAME
(
SEQ_NO NUMBER NOT NULL,
INSERT_DATE DATE NOT NULL,
FIRST_NAME VARCHAR2 (256 BYTE),
LAST_NAME VARCHAR2 (256 BYTE),
ID_NUM NUMBER,
ID_STATUS NUMBER
)
PARTITION BY RANGE
(INSERT_DATE)
SUBPARTITION BY LIST
(ID_STATUS)
SUBPARTITION TEMPLATE (
SUBPARTITION SP1 VALUES (0) TABLESPACE &tblspce,
SUBPARTITION SP2 VALUES (1) TABLESPACE &tblspce,
SUBPARTITION SP3 VALUES (2) TABLESPACE &tblspce)
(
PARTITION &partition_name_01
VALUES LESS THAN
(TO_DATE ('&partition_date_01',
'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIAN')),
PARTITION &partition_name_02
VALUES LESS THAN
(TO_DATE ('&partition_date_02',
'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIAN')),
PARTITION &partition_name_03
VALUES LESS THAN
(TO_DATE ('&partition_date_03',
'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIAN')),
sysdate
PARTITION &partition_name_04
VALUES LESS THAN
(TO_DATE ('&partition_date_04',
'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIAN')))
ENABLE ROW MOVEMENT;
有一個產品,照顧它自動。 PartitionManager for Oracle提供基於組織保留的自動分區管理,包括清除和歸檔舊數據,統計數據副本等。您可以在http://www.xyrosoft.com
這對Oracle已經提供的內容有何改進? – 2013-09-08 09:06:28
+1上嘗試它+1 INTERVAL分區的引入消除了大多數家庭需求生成的解決方案來自動管理分區的添加。我希望Oracle提供的唯一增強功能是爲生成的分區名稱定義格式掩碼的一種方式 - 它們現在使用通用系統生成的名稱生成,並且我總是必須查看x_tab_partitions中的LONG列HIGH_VALUE以獲取有意義的信息關於間隔。 – dpbradley 2010-02-03 14:28:28
@dpbradley - 我還沒有幸運地在11g中真正使用分區,但我可以看到這會讓人很煩惱。 – APC 2010-02-03 15:16:07
只是一個警告,你不能混用引用分區與間隔分區。我們選擇使用引用分區,然後用我們的首選命名約定來手動創建每月分區。 – PenFold 2010-02-03 16:42:54