日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
oracle怎么修改分區(qū),oracle如何新建分區(qū)

ORACLE表分區(qū)

一.表分區(qū)策略

創(chuàng)新互聯公司服務項目包括昌邑網站建設、昌邑網站制作、昌邑網頁制作以及昌邑網絡營銷策劃等。多年來,我們專注于互聯網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯網行業(yè)的解決方案,昌邑網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到昌邑省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

1.識別大表

采用ANALYZE TABLE語句進行分析,然后查詢數據字典獲得相應的數據量。

2.大表如何分區(qū)

可根據月份,季度以及年份等進行分區(qū);

3.分區(qū)的表空間規(guī)劃

要對每個表空間的大小進行估計

二.創(chuàng)建表分區(qū)

a.創(chuàng)建范圍分區(qū)的關鍵字是'RANGE'

1.范圍分區(qū)

create table ware_retail_part --創(chuàng)建一個描述商品零售的數據表

(

id integer primary key,--銷售編號

retail_date date,--銷售日期

ware_name varchar2(50)--商品名稱

)

partition by range(retail_date)

(

--2011年第一個季度為part_01分區(qū)

partition par_01 values less than(to_date('2011-04-01','yyyy-mm-dd')) tablespace TEMP01,

--2011年第二個季度為part_02分區(qū)

partition par_02 values less than(to_date('2011-07-01','yyyy-mm-dd')) tablespace TEMP01,

--2011年第三個季度為part_03分區(qū)

partition par_03 values less than(to_date('2011-10-01','yyyy-mm-dd')) tablespace TEMP01,

--2011年第四個季度為part_04分區(qū)

partition par_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace TEMP01

);

2.創(chuàng)建散列分區(qū)

3.組合分區(qū):

4.interval 分區(qū)

三.創(chuàng)建索引分區(qū)

索引分區(qū)分為本地索引分區(qū)和全局索引分區(qū),全局索引不反應基礎表的結構,要分區(qū)只能進行范圍分區(qū)。

創(chuàng)建索引分區(qū)要參照表分區(qū)

四.分區(qū)技術簡介

優(yōu)點:

1.減少維護工作量

2.增強數據的可用性

3.均衡I/O,提升性能

4.提高查詢速度

5.分區(qū)對用戶保持透明,用戶感覺不到分區(qū)的存在。

五,管理表分區(qū)

1.添加表分區(qū)

ALTER TABLE...ALTER PARATITION

2.合并表分區(qū)

3.刪除分區(qū)

ALTER TABLE...DROP PARTITION

刪除分區(qū)時,里面的數據也會被刪除。

-創(chuàng)建表和分區(qū)

create table sales--創(chuàng)建一個銷售記錄表

(

id number primary key,--記錄編號

goodsname varchar2(10),--商品名

saledate date--銷售日期

)

partition by range(saledate)--按照日期分區(qū)

(

--第一季度數據

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

);

--創(chuàng)建局部索引

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

);

--并入分區(qū)

alter table sales merge partitions part_sea3,part_sea4 into partition part_sea4;

--重建局部索引

alter table sales modify partition part_sea4 rebuild unusable local indexes;

六.管理索引分區(qū)

刪除索引:DROP PARTITION

重建分區(qū):REBUILT PARTITION

更名索引分區(qū):RENAME PARTITION

分割索引分區(qū):SPLIT PARTITION

oracle怎么更改分區(qū)關鍵字

默認情況下,oracle的分區(qū)表對于分區(qū)字段是不允許進行update操作的,如果有對分區(qū)字段行進update,就會報錯——ORA-14402: 更新分區(qū)關鍵字列將導致分區(qū)的更改。但是可以通過打開表的row movement屬性來允許對分區(qū)字段的update操作。

例:創(chuàng)建分區(qū)表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

分區(qū)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: 更新分區(qū)關鍵字列將導致分區(qū)的更改

打開row movement屬性

SQL alter table test_part enable row movement;

Table altered

再次執(zhí)行update操作

SQL update test_part set a1=1123 where a1=123;

1 row updated

執(zhí)行是成功的并遷移到分區(qū)P2上了,且這時候rowid也發(fā)生了變化

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分區(qū)字段的數據(跨分區(qū)的)

Oracle創(chuàng)建分區(qū)表操作

1、創(chuàng)建語句

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、添加分區(qū)

alter table p add partition p4 values less than (400) tablespace t4;

3、清除分區(qū)數據

alter table p trunc partition p1;

4、刪除分區(qū)

alter table p drop partition p1;

oracle一張上千萬記錄的數據表需要改為分區(qū)表,用什么方法好?

Oracle提供了分區(qū)技術以支持VLDB(Very Large DataBase)。分區(qū)表通過對分區(qū)列的判斷,把分區(qū)列不同的記錄,放到不同的分區(qū)中。分區(qū)完全對應用透明。

Oracle的分區(qū)表可以包括多個分區(qū),每個分區(qū)都是一個獨立的段(SEGMENT),可以存放到不同的表空間中。查詢時可以通過查詢表來訪問各個分區(qū)中的數據,也可以通過在查詢時直接指定分區(qū)的方法來進行查詢。

分區(qū)提供以下優(yōu)點:

由于將數據分散到各個分區(qū)中,減少了數據損壞的可能性;

可以對單獨的分區(qū)進行備份和恢復;

可以將分區(qū)映射到不同的物理磁盤上,來分散IO;

提高可管理性、可用性和性能。

Oracle提供了以下幾種分區(qū)類型:

范圍分區(qū)(range);

哈希分區(qū)(hash);

列表分區(qū)(list);

范圍-哈希復合分區(qū)(range-hash);

范圍-列表復合分區(qū)(range-list)。

Oracle的普通表沒有辦法通過修改屬性的方式直接轉化為分區(qū)表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,并說明它們各自的特點。

方法一:利用原表重建分區(qū)表。

步驟:

SQL CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已創(chuàng)建。

SQL INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已創(chuàng)建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;

表已創(chuàng)建。

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

優(yōu)點:方法簡單易用,由于采用DDL語句,不會產生UNDO,且只產生少量REDO,效率相對較高,而且建表完成后數據已經在分布到各個分區(qū)中了。

不足:對于數據的一致性方面還需要額外的考慮。由于幾乎沒有辦法通過手工鎖定T表的方式保證一致性,在執(zhí)行CREATE TABLE語句和RENAME T_NEW TO T語句直接的修改可能會丟失,如果要保證一致性,需要在執(zhí)行完語句后對數據進行檢查,而這個代價是比較大的。另外在執(zhí)行兩個RENAME語句之間執(zhí)行的對T的訪問會失敗。

適用于修改不頻繁的表,在閑時進行操作,表的數據量不宜太大。

方法二:使用交換分區(qū)的方法。

步驟:

SQL CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已創(chuàng)建。

SQL INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已創(chuàng)建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));

表已創(chuàng)建。

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

優(yōu)點:只是對數據字典中分區(qū)和表的定義進行了修改,沒有數據的修改或復制,效率最高。如果對數據在分區(qū)中的分布沒有進一步要求的話,實現比較簡單。在執(zhí)行完RENAME操作后,可以檢查T_OLD中是否存在數據,如果存在的話,直接將這些數據插入到T中,可以保證對T插入的操作不會丟失。

不足:仍然存在一致性問題,交換分區(qū)之后RENAME T_NEW TO T之前,查詢、更新和刪除會出現錯誤或訪問不到數據。如果要求數據分布到多個分區(qū)中,則需要進行分區(qū)的SPLIT操作,會增加操作的復雜度,效率也會降低。

適用于包含大數據量的表轉到分區(qū)表中的一個分區(qū)的操作。應盡量在閑時進行操作。

方法三:Oracle9i以上版本,利用在線重定義功能

步驟:

SQL CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已創(chuàng)建。

SQL INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已創(chuàng)建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));

表已創(chuàng)建。

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

優(yōu)點:保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。而且,可以在切換前進行相應的授權并建立各種約束,可以做到切換完成后不再需要任何額外的管理操作。

不足:實現上比上面兩種略顯復雜。

適用于各種情況。

這里只給出了在線重定義表的一個最簡單的例子,詳細的描述和例子可以參考下面兩篇文章。

Oracle的在線重定義表功能:

Oracle的在線重定義表功能(二):

索引也可以進行分區(qū),分區(qū)索引有兩種類型:global和local。對于local索引,每一個表分區(qū)對應一個索引分區(qū),當表的分區(qū)發(fā)生變化時,索引的維護由Oracle自動進行。對于global索引,可以選擇是否分區(qū),而且索引的分區(qū)可以不與表分區(qū)相對應。當對分區(qū)進行維護操作時,通常會導致全局索引的INVALDED,必須在執(zhí)行完操作后REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES語句,可以使在進行分區(qū)維護的同時重建全局索引。

全局索引可以包含多個分區(qū)的值 局部索引比全局索引容易管理,而全局索引比較快

注意:不能為散列分區(qū) 或者 子分區(qū)創(chuàng)建全局索引

Oracle的分區(qū)功能十分強大。不過用起來發(fā)現有兩點不大方便:

第一是已經存在的表沒有方法可以直接轉化為分區(qū)表。不過Oracle提供了在線重定義表的功能,可以通過這種方式來完成普通表到分區(qū)表的轉化。可以參考這個例子:

第二點是如果采用了local分區(qū)索引,那么在增加表分區(qū)的時候,索引分區(qū)的表空間是不可控制的。如果希望將表和索引的分區(qū)分開到不同的表空間且不同索引分區(qū)也分散到不同的表空間中,那么只能在增加分區(qū)后,對新增的分區(qū)索引單獨rebuild。

Oracle最大允許存在多少個分區(qū)呢?

我們可以從Oracle的Concepts手冊上找到這個信息,對于Oracle9iR2:

Tables can be partitioned into up to 64,000 separate partitions.

對于Oracle10gR2,Oracle增強了分區(qū)特性:

Tables can be partitioned into up to 1024K-1 separate partitions.

關于何時應該進行分區(qū),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.

這些信息是在網上查到的,測試了下確實可以用。

oracle11g自動分區(qū)

在Oracle10g中,沒有定義間隔分區(qū),只能通過范圍分區(qū)實現間隔分區(qū)功能,如果要實現自動創(chuàng)建分區(qū),只能通過創(chuàng)建JOB或者scheduler來實現;而在11g中,Oracle直接提供了間隔分區(qū)功能,大大簡化了間隔分區(qū)的實現。

----注:oracle11g雖然可以自動分區(qū),但是分區(qū)的名字不能自定義,對于需要定時刪除分區(qū)時沒法處理,不如通過時間范圍來手工分區(qū)。詳見

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有間隔分區(qū)功能,對于使用Range分區(qū)的可以按年,月,日來自動生成分區(qū)。

2、2019-08-01前的數據(包含8月份的數據)會放入hip_log_node_partition?分區(qū),8月1日后的數據每月只要有數據,就會自動創(chuàng)建一個分區(qū)。也就是從9月開始,開始新建分區(qū)。

3、interval函數--將數值按標準換算為日期

numtodsinterval、numtodsinterval函數,將數字轉成年月,時分秒

詳見:

4、查看表分區(qū) select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_SALES';

5、插入數據再次查看分區(qū),詳見:

6、修改分區(qū)、合并分區(qū)、拆分分區(qū),詳見 :

7、創(chuàng)建索引(分區(qū)索引、全局索引) :

非分區(qū)字段創(chuàng)建主鍵,則創(chuàng)建主鍵local索引時必須加上分區(qū)字段

ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (主鍵字段,分區(qū)字段) USING INDEX LOCAL;

8、oracle 10g創(chuàng)建表分區(qū)

9、刪除

1.不保留,直接刪除:

alter table table_name drop/truncate partition partition_name;

具體用drop還是truncate,得你自己衡量,drop的話原來的分區(qū)和數據直接就沒有了,truncate的話,只是數據沒有了,分區(qū)還在。


當前標題:oracle怎么修改分區(qū),oracle如何新建分區(qū)
本文網址:http://www.dlmjj.cn/article/heddce.html