一.表分區策略
創新互聯公司服務項目包括昌邑網站建設、昌邑網站制作、昌邑網頁制作以及昌邑網絡營銷策劃等。多年來,我們專注于互聯網行業,利用自身積累的技術優勢、行業經驗、深度合作伙伴關系等,向廣大中小型企業、政府機構等提供互聯網行業的解決方案,昌邑網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到昌邑省份的部分城市,未來相信會繼續擴大服務區域并繼續獲得客戶的支持與信任!
1.識別大表
采用ANALYZE TABLE語句進行分析,然后查詢數據字典獲得相應的數據量。
2.大表如何分區
可根據月份,季度以及年份等進行分區;
3.分區的表空間規劃
要對每個表空間的大小進行估計
二.創建表分區
a.創建范圍分區的關鍵字是'RANGE'
1.范圍分區
create table ware_retail_part --創建一個描述商品零售的數據表
(
id integer primary key,--銷售編號
retail_date date,--銷售日期
ware_name varchar2(50)--商品名稱
)
partition by range(retail_date)
(
--2011年第一個季度為part_01分區
partition par_01 values less than(to_date('2011-04-01','yyyy-mm-dd')) tablespace TEMP01,
--2011年第二個季度為part_02分區
partition par_02 values less than(to_date('2011-07-01','yyyy-mm-dd')) tablespace TEMP01,
--2011年第三個季度為part_03分區
partition par_03 values less than(to_date('2011-10-01','yyyy-mm-dd')) tablespace TEMP01,
--2011年第四個季度為part_04分區
partition par_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace TEMP01
);
2.創建散列分區
3.組合分區:
4.interval 分區
三.創建索引分區
索引分區分為本地索引分區和全局索引分區,全局索引不反應基礎表的結構,要分區只能進行范圍分區。
創建索引分區要參照表分區
四.分區技術簡介
優點:
1.減少維護工作量
2.增強數據的可用性
3.均衡I/O,提升性能
4.提高查詢速度
5.分區對用戶保持透明,用戶感覺不到分區的存在。
五,管理表分區
1.添加表分區
ALTER TABLE...ALTER PARATITION
2.合并表分區
3.刪除分區
ALTER TABLE...DROP PARTITION
刪除分區時,里面的數據也會被刪除。
-創建表和分區
create table sales--創建一個銷售記錄表
(
id number primary key,--記錄編號
goodsname varchar2(10),--商品名
saledate date--銷售日期
)
partition by range(saledate)--按照日期分區
(
--第一季度數據
partition part_sea1 values less than(to_date('2011-04-01','yyyy-mm-dd')) tablespace tbsp_1,
--第二季度數據
partition part_sea2 values less than(to_date('2011-07-01','yyyy-mm-dd')) tablespace tbsp_2,
--第三季度數據
partition part_sea3 values less than(to_date('2011-10-01','yyyy-mm-dd')) tablespace tbsp_1,
--第四季度數據
partition part_sea4 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace tbsp_2
);
--創建局部索引
create index index_3_4 on sales(saledate)
local(
partition part_seal tablespace tbsp_1,
partition part_sea2 tablespace tbsp_2,
partition part_sea3 tablespace tbsp_1,
partition part_sea4 tablespace tbsp_2
);
--并入分區
alter table sales merge partitions part_sea3,part_sea4 into partition part_sea4;
--重建局部索引
alter table sales modify partition part_sea4 rebuild unusable local indexes;
六.管理索引分區
刪除索引:DROP PARTITION
重建分區:REBUILT PARTITION
更名索引分區:RENAME PARTITION
分割索引分區:SPLIT PARTITION
默認情況下,oracle的分區表對于分區字段是不允許進行update操作的,如果有對分區字段行進update,就會報錯——ORA-14402: 更新分區關鍵字列將導致分區的更改。但是可以通過打開表的row movement屬性來允許對分區字段的update操作。
例:創建分區表test_part進行實驗
create table TEST_PART
(
A1 NUMBERnot null,
A2 DATE not null,
A3 VARCHAR2(6) not null,
A4 DATE not null,
A5 NUMBER not null,
)
partition by range (A1)
(
partition P1 values less than (1000),
partition P2 values less than (2000),
partition P3 values less than (3000),
partition P4 values less than (4000),
partition P5 values less than (5000),
partition P6 values less than (MAXVALUE)
);
插入如下的數據
SQL select * from test_part;
A1 A2 A3 A4 A5
---------- ----------- ------ ----------- ----------
123 2006-06-30 123456 2006-06-30 123
456 2006-06-30 asdfgh 2006-06-30 456
1 2006-06-30 234123 2006-06-30 1
2 2006-06-30 234234 2006-06-30 2
1234 2006-06-30 456789 2006-06-30 1234
1111 2006-06-30 ewrqwe 2006-06-30 1111
2222 2006-06-30 fdafda 2006-06-30 2222
3333 2006-06-30 342342 2006-06-30 3333
5678 2006-06-30 qwerty 2006-06-30 5678
9 rows selected
分區P1、P2的數據分別為:
SQL select rowid,t.* from test_part partition(p1) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLoAAGAAAtsEAAB 456 2006-06-30 asdfgh 2006-06-30 456
AAAGLoAAGAAAtsEAAC 1 2006-06-30 234123 2006-06-30 1
AAAGLoAAGAAAtsEAAD 2 2006-06-30 234234 2006-06-30 2
AAAGLoAAGAAAtsEAAE 123 2006-06-30 123456 2006-06-30 123
SQL select rowid,t.* from test_part partition(p2) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC 1234 2006-06-30 456789 2006-06-30 1234
AAAGLwAAGAAA+8MAAD 1111 2006-06-30 ewrqwe 2006-06-30 1111
直接update提示錯誤
SQL update test_part set a1=1123 where a1=123;
update test_part set a1=1123 where a1=123
ORA-14402: 更新分區關鍵字列將導致分區的更改
打開row movement屬性
SQL alter table test_part enable row movement;
Table altered
再次執行update操作
SQL update test_part set a1=1123 where a1=123;
1 row updated
執行是成功的并遷移到分區P2上了,且這時候rowid也發生了變化
SQL select rowid,t.* from test_part partition(p2) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC 1234 2006-06-30 456789 2006-06-30 1234
AAAGLwAAGAAA+8MAAD 1111 2006-06-30 ewrqwe 2006-06-30 1111
AAAGLwAAGAAA+8PAAB 1123 2006-06-30 123456 2006-06-30 123
SQL
enable row movement可以允許數據段的壓縮、update分區字段的數據(跨分區的)
1、創建語句
create table p(id number)
partition by range(id)
(partition p1 values less than(100) tablespace t1,
partition p2 values less than(200) tablespace t2,
partition p3 values less than(300) tablespace t3);
2、添加分區
alter table p add partition p4 values less than (400) tablespace t4;
3、清除分區數據
alter table p trunc partition p1;
4、刪除分區
alter table p drop partition p1;
Oracle提供了分區技術以支持VLDB(Very Large DataBase)。分區表通過對分區列的判斷,把分區列不同的記錄,放到不同的分區中。分區完全對應用透明。
Oracle的分區表可以包括多個分區,每個分區都是一個獨立的段(SEGMENT),可以存放到不同的表空間中。查詢時可以通過查詢表來訪問各個分區中的數據,也可以通過在查詢時直接指定分區的方法來進行查詢。
分區提供以下優點:
由于將數據分散到各個分區中,減少了數據損壞的可能性;
可以對單獨的分區進行備份和恢復;
可以將分區映射到不同的物理磁盤上,來分散IO;
提高可管理性、可用性和性能。
Oracle提供了以下幾種分區類型:
范圍分區(range);
哈希分區(hash);
列表分區(list);
范圍-哈希復合分區(range-hash);
范圍-列表復合分區(range-list)。
Oracle的普通表沒有辦法通過修改屬性的方式直接轉化為分區表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,并說明它們各自的特點。
方法一:利用原表重建分區表。
步驟:
SQL CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
表已創建。
SQL INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;
已創建6264行。
SQL COMMIT;
提交完成。
SQL CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE))
6 AS SELECT ID, TIME FROM T;
表已創建。
SQL RENAME T TO T_OLD;
表已重命名。
SQL RENAME T_NEW TO T;
表已重命名。
SQL SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264
SQL SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
----------
SQL SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
6246
SQL SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
18
優點:方法簡單易用,由于采用DDL語句,不會產生UNDO,且只產生少量REDO,效率相對較高,而且建表完成后數據已經在分布到各個分區中了。
不足:對于數據的一致性方面還需要額外的考慮。由于幾乎沒有辦法通過手工鎖定T表的方式保證一致性,在執行CREATE TABLE語句和RENAME T_NEW TO T語句直接的修改可能會丟失,如果要保證一致性,需要在執行完語句后對數據進行檢查,而這個代價是比較大的。另外在執行兩個RENAME語句之間執行的對T的訪問會失敗。
適用于修改不頻繁的表,在閑時進行操作,表的數據量不宜太大。
方法二:使用交換分區的方法。
步驟:
SQL CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
表已創建。
SQL INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;
已創建6264行。
SQL COMMIT;
提交完成。
SQL CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (MAXVALUE));
表已創建。
SQL ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;
表已更改。
SQL RENAME T TO T_OLD;
表已重命名。
SQL RENAME T_NEW TO T;
表已重命名。
SQL SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264
優點:只是對數據字典中分區和表的定義進行了修改,沒有數據的修改或復制,效率最高。如果對數據在分區中的分布沒有進一步要求的話,實現比較簡單。在執行完RENAME操作后,可以檢查T_OLD中是否存在數據,如果存在的話,直接將這些數據插入到T中,可以保證對T插入的操作不會丟失。
不足:仍然存在一致性問題,交換分區之后RENAME T_NEW TO T之前,查詢、更新和刪除會出現錯誤或訪問不到數據。如果要求數據分布到多個分區中,則需要進行分區的SPLIT操作,會增加操作的復雜度,效率也會降低。
適用于包含大數據量的表轉到分區表中的一個分區的操作。應盡量在閑時進行操作。
方法三:Oracle9i以上版本,利用在線重定義功能
步驟:
SQL CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
表已創建。
SQL INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;
已創建6264行。
SQL COMMIT;
提交完成。
SQL EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL 過程已成功完成。
SQL CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE));
表已創建。
SQL EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW', -
'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL 過程已成功完成。
SQL EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('YANGTK', 'T', 'T_NEW');
PL/SQL 過程已成功完成。
SQL SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264
SQL SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
6246
SQL SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
18
優點:保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。而且,可以在切換前進行相應的授權并建立各種約束,可以做到切換完成后不再需要任何額外的管理操作。
不足:實現上比上面兩種略顯復雜。
適用于各種情況。
這里只給出了在線重定義表的一個最簡單的例子,詳細的描述和例子可以參考下面兩篇文章。
Oracle的在線重定義表功能:
Oracle的在線重定義表功能(二):
索引也可以進行分區,分區索引有兩種類型:global和local。對于local索引,每一個表分區對應一個索引分區,當表的分區發生變化時,索引的維護由Oracle自動進行。對于global索引,可以選擇是否分區,而且索引的分區可以不與表分區相對應。當對分區進行維護操作時,通常會導致全局索引的INVALDED,必須在執行完操作后REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES語句,可以使在進行分區維護的同時重建全局索引。
全局索引可以包含多個分區的值 局部索引比全局索引容易管理,而全局索引比較快
注意:不能為散列分區 或者 子分區創建全局索引
Oracle的分區功能十分強大。不過用起來發現有兩點不大方便:
第一是已經存在的表沒有方法可以直接轉化為分區表。不過Oracle提供了在線重定義表的功能,可以通過這種方式來完成普通表到分區表的轉化。可以參考這個例子:
第二點是如果采用了local分區索引,那么在增加表分區的時候,索引分區的表空間是不可控制的。如果希望將表和索引的分區分開到不同的表空間且不同索引分區也分散到不同的表空間中,那么只能在增加分區后,對新增的分區索引單獨rebuild。
Oracle最大允許存在多少個分區呢?
我們可以從Oracle的Concepts手冊上找到這個信息,對于Oracle9iR2:
Tables can be partitioned into up to 64,000 separate partitions.
對于Oracle10gR2,Oracle增強了分區特性:
Tables can be partitioned into up to 1024K-1 separate partitions.
關于何時應該進行分區,Oracle有如下建議:
■ Tables greater than 2GB should always be considered for partitioning.
■ Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.
這些信息是在網上查到的,測試了下確實可以用。
在Oracle10g中,沒有定義間隔分區,只能通過范圍分區實現間隔分區功能,如果要實現自動創建分區,只能通過創建JOB或者scheduler來實現;而在11g中,Oracle直接提供了間隔分區功能,大大簡化了間隔分區的實現。
----注:oracle11g雖然可以自動分區,但是分區的名字不能自定義,對于需要定時刪除分區時沒法處理,不如通過時間范圍來手工分區。詳見
create table HIP_LOG_NODE_Part
(
ID?????????????????? VARCHAR2(32)???????? not null,
RECORD_TIME????????? DATE
)tablespace TB_HIP_LOG_NODE
PARTITION BY RANGE (RECORD_TIME) interval (numtoyminterval(1, 'month'))
STORE IN (TB_HIP_LOG_NODE)
(
partition hip_log_node_partition values less than (to_date('2019-08-01 00:00','yyyy-MM-dd HH24:mi')) tablespace TB_HIP_LOG_NODE
);
1、Oracle11g有間隔分區功能,對于使用Range分區的可以按年,月,日來自動生成分區。
2、2019-08-01前的數據(包含8月份的數據)會放入hip_log_node_partition?分區,8月1日后的數據每月只要有數據,就會自動創建一個分區。也就是從9月開始,開始新建分區。
3、interval函數--將數值按標準換算為日期
numtodsinterval、numtodsinterval函數,將數字轉成年月,時分秒
詳見:
4、查看表分區 select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_SALES';
5、插入數據再次查看分區,詳見:
6、修改分區、合并分區、拆分分區,詳見 :
7、創建索引(分區索引、全局索引) :
非分區字段創建主鍵,則創建主鍵local索引時必須加上分區字段
ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (主鍵字段,分區字段) USING INDEX LOCAL;
8、oracle 10g創建表分區
9、刪除
1.不保留,直接刪除:
alter table table_name drop/truncate partition partition_name;
具體用drop還是truncate,得你自己衡量,drop的話原來的分區和數據直接就沒有了,truncate的話,只是數據沒有了,分區還在。
分享名稱:oracle怎么修改分區,oracle如何新建分區
瀏覽地址:http://vcdvsql.cn/article24/heddce.html
成都網站建設公司_創新互聯,為您提供網站設計公司、定制開發、建站公司、Google、服務器托管、定制網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯