隨著信息業的發展
大數據量表的數據量一般來說是跟時間成正比的
通常情況
大表的時效性可以通過在表上加時間戳列來實現
Oracle
分區表有
n Range Partitioning
n Hash Partitioning
n Composite Partitioning
n List Partitioning
對於有時效性的大表
CREATE TABLE Test(
DATATIME DATE NOT NULL
P
P
P
P
P
P
P
P
CONSTRAINT PK_TEST PRIMARY KEY (datatime
)
PARTITION BY RANGE (DATATIME)
(PARTITION Test_
(PARTITION Test_
……
);
對於按時間分區仍然不能滿足性能需求的表
應用設計中
大表的維護工作比較繁瑣
此章節以按天分區的分區表為例討論大表的自動維護
分區表分區的命名應當按照一定的規則命名
在數據庫中創建維護字典表
Table Name: H_RETENTION
Column Type Null? Description
tablename Varchar
schemaname Varchar
typeid Varchar
retention Number(
對於按時間分區的分區表
創建分區可以手工創建
自動創建分區實現如下
/**************************************************************************
Program Name:Add_Partition
Description:
創建某個用戶下個月的所有分區
***************************************************************************/
PROCEDURE add_partition (v_schema IN VARCHAR
IS
CURSOR c_td_table
IS
SELECT tablename
FROM h_retention
WHERE typeid =
AND schemaname = UPPER (v_schema)
ORDER BY tablename;
v_cur BINARY_INTEGER;
v_int BINARY_INTEGER;
v_partition VARCHAR
v_date DATE;
v_days NUMBER;
sql_stmt VARCHAR
err_msg VARCHAR
BEGIN
v_date := TRUNC (ADD_MONTHS (SYSDATE
v_days :=
TO_NUMBER (TO_CHAR (LAST_DAY (ADD_MONTHS (SYSDATE
v_cur := DBMS_SQL
FOR v_table IN c_td_table
LOOP
v_date := TRUNC (ADD_MONTHS (SYSDATE
v_partition := v_table
FOR i IN
LOOP
BEGIN
sql_stmt :=
|| v_schema
||
|| v_table
||
|| v_partition
||
|| TO_CHAR (v_date
||
||
|| TO_CHAR (v_date +
||
DBMS_SQL
v_int := DBMS_SQL
EXCEPTION
WHEN OTHERS
THEN
err_msg :=
v_partition
||
|| TO_CHAR (v_date
||
|| SQLERRM;
log_insert (err_msg);
COMMIT;
END;
v_date := v_date +
END LOOP;
END LOOP;
DBMS_SQL
END;
為了釋放存儲空間並提高大表的性能
u 速度快
u 占用回滾表空間少
u 產生日志量少
u 釋放空間
如果有global的索引
自動刪除分區實現如下
當前分區表的分區情況可以通過Oracle的數據字典dba_tab_partitions獲得
From:http://tw.wingwit.com/Article/program/Oracle/201311/18275.html