時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
1 簡(jiǎn)介
隨著信息業(yè)的發(fā)展,在企業(yè)級(jí)數(shù)據(jù)庫(kù)應(yīng)用中,經(jīng)常會(huì)有一些幾十GB,上百GB的數(shù)據(jù)表。這些大數(shù)據(jù)量表的設(shè)計(jì),維護(hù)及其備份都是數(shù)據(jù)庫(kù)管理中的重點(diǎn)及其難點(diǎn)。本文就從設(shè)計(jì)、維護(hù)及其備份方面探討一下大數(shù)據(jù)量表的管理。
2 設(shè)計(jì)
2.1 大表時(shí)效性
大數(shù)據(jù)量表的數(shù)據(jù)量一般來(lái)說(shuō)是跟時(shí)間成正比的,時(shí)間越久,數(shù)據(jù)量越大。 在設(shè)計(jì)階段首先要考慮這些大表的時(shí)效性。
通常情況,在一定的時(shí)間區(qū)間,數(shù)據(jù)的訪問(wèn)頻度比較大,超過(guò)這個(gè)區(qū)間,數(shù)據(jù)的訪問(wèn)頻度極小。這個(gè)時(shí)間區(qū)間根據(jù)不同的應(yīng)用類型而不同,通常是幾個(gè)月。超過(guò)這個(gè)時(shí)間區(qū)間的數(shù)據(jù)可以認(rèn)為是歷史數(shù)據(jù),數(shù)據(jù)訪問(wèn)的可能性不打。在企業(yè)應(yīng)用中,并不是所有的數(shù)據(jù)都需要保留在生產(chǎn)數(shù)據(jù)庫(kù)中,對(duì)于這些歷史數(shù)據(jù),可以考慮離線存放,或者是存放在另外的數(shù)據(jù)庫(kù)中,比如數(shù)據(jù)倉(cāng)庫(kù)等。
大表的時(shí)效性可以通過(guò)在表上加時(shí)間戳列來(lái)實(shí)現(xiàn)。
2.2 使用分區(qū)表
Oracle 8以后提供了分區(qū)表的功能,分區(qū)表可以把一個(gè)表的數(shù)據(jù)從物理和邏輯上分割成小的區(qū)域。 Oracle支持非常大的分區(qū)表,一個(gè)對(duì)象可以允許多達(dá)64000個(gè)分區(qū)。對(duì)于大表來(lái)說(shuō),使用分區(qū)表是首選方案。 分區(qū)表可以改善表的維護(hù)、備份、恢復(fù)及查詢性能。
分區(qū)表有4種分區(qū)方式:
n Range Partitioning
n Hash Partitioning
n Composite Partitioning
n List Partitioning
對(duì)于有時(shí)效性的大表,可以采用按時(shí)間分區(qū)的 Range Partitioning表,例如按天分區(qū)的分區(qū)表。
CREATE TABLE Test(
DATATIME? DATE????? NOT NULL,
P1?? NUMBER? NULL,
P2?? NUMBER? NULL,
P3?? NUMBER? NULL,
P4?? NUMBER? NULL,
P5?? NUMBER? NULL,
P6?? NUMBER? NULL,
P7?? NUMBER? NULL,
P8?? NUMBER? NULL,
CONSTRAINT PK_TEST PRIMARY KEY (datatime, p1,p2) USING INDEX LOCAL TABLESPACE USERINDEX
)
PARTITION BY RANGE (DATATIME)
(PARTITION Test_060101 VALUES LESS THAN (TO_DATE('2006-01-02','YYYY-MM-DD')),
(PARTITION Test_060102 VALUES LESS THAN (TO_DATE('2006-01-03','YYYY-MM-DD')),
……
);
對(duì)于按時(shí)間分區(qū)仍然不能滿足性能需求的表, 還可以根據(jù)應(yīng)用需求,使用子分區(qū)對(duì)表進(jìn)一步細(xì)化。
應(yīng)用設(shè)計(jì)中,要充分利用分區(qū)表的特性,對(duì)大表的訪問(wèn)要完全避免全表訪問(wèn),縮小訪問(wèn)范圍。在查詢條件中,盡量使用分區(qū)的列。
3 維護(hù)
大表的維護(hù)工作比較繁瑣,索引的維護(hù),存儲(chǔ)空間的維護(hù),歷史數(shù)據(jù)的清理等等,使用分區(qū)表可以簡(jiǎn)化大表的維護(hù)工作,但是如果表很多的話,手動(dòng)的創(chuàng)建、刪除分區(qū)也是一件很繁瑣,而且容易出錯(cuò)的事情。
此章節(jié)以按天分區(qū)的分區(qū)表為例討論大表的自動(dòng)維護(hù)。
3.1 分區(qū)表的命名規(guī)則
分區(qū)表分區(qū)的命名應(yīng)當(dāng)按照一定的規(guī)則命名,以利于自動(dòng)維護(hù)的實(shí)現(xiàn)。本例采用按天分區(qū)的分區(qū)表,分區(qū)的命名方式為TABLENAME_YYMMDD,例如:TEST表的2006年6月1日的分區(qū)命名為TEST _060601。
3.2 維護(hù)字典
在數(shù)據(jù)庫(kù)中創(chuàng)建維護(hù)字典表,存放需要自動(dòng)維護(hù)的分區(qū)表的信息,包括表名,schema,表的類型,數(shù)據(jù)在數(shù)據(jù)庫(kù)中的保留時(shí)間等信息。
Table Name: H_RETENTION
Column Type Null? Description
tablename Varchar2(30) Not null 表名
schemaname Varchar2(30) Not null Schema
typeid Varchar2(20) Not null 表類型1. PARTITION2. NORMAL3. …。。
retention Number(3) Not null 該表的保存天數(shù)。
3.3 自動(dòng)創(chuàng)建分區(qū)
對(duì)于按時(shí)間分區(qū)的分區(qū)表,若不能及時(shí)創(chuàng)建新的數(shù)據(jù)分區(qū),會(huì)導(dǎo)致數(shù)據(jù)無(wú)法插入到分區(qū)表的嚴(yán)重后果,數(shù)據(jù)庫(kù)會(huì)產(chǎn)生報(bào)錯(cuò)信息ORA-14400: inserted partition key does not map to any partition,插入失敗。
創(chuàng)建分區(qū)可以手工創(chuàng)建,也可以根據(jù)維護(hù)字典,通過(guò)系統(tǒng)的任務(wù)調(diào)度來(lái)創(chuàng)建分區(qū)。通常是在月底創(chuàng)建下個(gè)月的分區(qū)。
自動(dòng)創(chuàng)建分區(qū)實(shí)現(xiàn)如下:
/**************************************************************************
Program Name:Add_Partition
Description:
創(chuàng)建某個(gè)用戶下個(gè)月的所有分區(qū)
***************************************************************************/
PROCEDURE add_partition (v_schema IN VARCHAR2)
IS
CURSOR c_td_table
IS
SELECT?? tablename
FROM? h_retention
WHERE typeid = 'PARTITION'
AND schemaname = UPPER (v_schema)
ORDER BY tablename;
v_cur?? BINARY_INTEGER;
v_int?? BINARY_INTEGER;
v_partition?? VARCHAR2 (30);
v_date? DATE;
v_days? NUMBER;
sql_stmt????? VARCHAR2 (1000);????? -- String used to save sql statement
err_msg VARCHAR2 (300);
BEGIN
v_date := TRUNC (ADD_MONTHS (SYSDATE, 1), 'MM');
v_days :=
TO_NUMBER (TO_CHAR (LAST_DAY (ADD_MONTHS (SYSDATE, 1)), 'DD'));
v_cur := DBMS_SQL.open_cursor;
FOR v_table IN c_td_table
LOOP
v_date := TRUNC (ADD_MONTHS (SYSDATE, 1), 'MM');
v_partition := v_table.tablename;
FOR i IN 1 .. v_days
LOOP
BEGIN
sql_stmt :=
'ALTER TABLE '
|| v_schema
|| '.'
|| v_table.tablename
|| ' ADD PARTITION '
|| v_partition
|| '_'
|| TO_CHAR (v_date, 'YYMMDD')
|| ' '
|| 'VALUES LESS THAN (TO_DATE('''
|| TO_CHAR (v_date + 1, 'YYYY-MM-DD')
|| ''',''YYYY-MM-DD'')) ';
DBMS_SQL.parse (v_cur, sql_stmt, DBMS_SQL.native);
v_int := DBMS_SQL.EXECUTE (v_cur);
EXCEPTION
WHEN OTHERS
THEN
err_msg :=
v_partition
|| ': Create '
|| TO_CHAR (v_date, 'YYMMDD')
|| ' partition unsuccessfully! Error Information:'
|| SQLERRM;
log_insert (err_msg);? --You can define your own log_insert function
COMMIT;
END;
v_date := v_date + 1;
END LOOP;
END LOOP;
DBMS_SQL.close_cursor (v_cur);
END;
3.4 自動(dòng)刪除過(guò)期分區(qū)
為了釋放存儲(chǔ)空間并提高大表的性能,要從數(shù)據(jù)庫(kù)中刪除大表中過(guò)期的歷史數(shù)據(jù)。刪除操作可以手工執(zhí)行,也可以通過(guò)系統(tǒng)的任務(wù)調(diào)度來(lái)自動(dòng)刪除。分區(qū)表數(shù)據(jù)刪除只需要?jiǎng)h除相應(yīng)的數(shù)據(jù)分區(qū),與delete相比,有如下好處:
u 速度快
u 占用回滾表空間少
u 產(chǎn)生日志量少關(guān)鍵詞標(biāo)簽:Oracle
相關(guān)閱讀
熱門文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法