日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle分区表编程,Oracle分区表详解

發(fā)布時間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle分区表编程,Oracle分区表详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當前位置:我的異常網(wǎng)? 編程???Oracle分區(qū)表詳解

Oracle分區(qū)表詳解

www.myexceptions.net??網(wǎng)友分享于:2013-10-28??瀏覽:25次

Oracle分區(qū)表詳解 .

一、Oracle分區(qū)簡介

ORACLE的分區(qū)是一種處理超大型表、索引等的技術。分區(qū)是一種“分而治之”的技術,通過將大表和索引分成可以管理的小塊,從而避免了對每個表作為一個大的、單獨的對象進行管理,為大量數(shù)據(jù)提供了可伸縮的性能。分區(qū)通過將操作分配給更小的存儲單元,減少了需要進行管理操作的時間,并通過增強的并行處理提高了性能,通過屏蔽故障數(shù)據(jù)的分區(qū),還增加了可用性。

二、Oracle分區(qū)優(yōu)缺點

優(yōu)點:

增強可用性:如果表的某個分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;

維護方便:如果表的某個分區(qū)出現(xiàn)故障,需要修復數(shù)據(jù),只修復該分區(qū)即可;

均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個系統(tǒng)性能;

改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關心的分區(qū),提高檢索速度。

缺點:

分區(qū)表相關:已經(jīng)存在的表沒有方法可以直接轉化為分區(qū)表。不過 Oracle 提供了在線重定義表的功能。

三、Oracle分區(qū)方法

范圍分區(qū):

范圍分區(qū)就是對數(shù)據(jù)表中的某個值的范圍進行分區(qū),根據(jù)某個值的范圍,決定將該數(shù)據(jù)存儲在哪個分區(qū)上。如根據(jù)序號分區(qū),根據(jù)業(yè)務記錄的創(chuàng)建日期進行分區(qū)等。

Hash分區(qū)(散列分區(qū)):

散列分區(qū)為通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因為通過在I/O設備上進行散列分區(qū),使得這些分區(qū)大小一致。

List分區(qū)(列表分區(qū)):

當你需要明確地控制如何將行映射到分區(qū)時,就使用列表分區(qū)方法。與范圍分區(qū)和散列分區(qū)所不同,列表分區(qū)不支持多列分區(qū)。如果要將表按列分區(qū),那么分區(qū)鍵就只能由表的一個單獨的列組成,然而可以用范圍分區(qū)或散列分區(qū)方法進行分區(qū)的所有的列,都可以用列表分區(qū)方法進行分區(qū)。

范圍-散列分區(qū)(復合分區(qū)):

有時候我們需要根據(jù)范圍分區(qū)后,每個分區(qū)內的數(shù)據(jù)再散列地分布在幾個表空間中,這樣我們就要使用復合分區(qū)。復合分區(qū)是先使用范圍分區(qū),然后在每個分區(qū)內再使用散列分區(qū)的一種分區(qū)方法(注意:先一定要進行范圍分區(qū))

范圍-列表分區(qū)(復合分區(qū)):

范圍和列表技術的組合,首先對表進行范圍分區(qū),然后用列表技術對每個范圍分區(qū)再次分區(qū)。與組合范圍-散列分區(qū)不同的是,每個子分區(qū)的所有內容表示數(shù)據(jù)的邏輯子集,由適當?shù)姆秶土斜矸謪^(qū)設置來描述。(注意:先一定要進行范圍分區(qū))

四、Oracle表分區(qū)表操作

--Partitioning 是否為true

select * from v$option s order by s.PARAMETER desc

--創(chuàng)建表空間

CREATE TABLESPACE "PARTION_03"

LOGGING

DATAFILE 'D:ORACLEORADATAJZHUAPARTION_03.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO

--刪除表空間

drop tablespace partion_01

--范圍分區(qū)技術語句

create table Partition_Test

(

PID number not null,

PITEM varchar2(200),

PDATA date not null

)

partition by range(PID)

(

partition part_01 values less than(50000) tablespace dinya_space01,

partition part_02 values less than(100000) tablespace dinya_space02,

partition part_03 values less than(maxvalue) tablespace dinya_space03

)

create table Partition_TTest

(

PID number not null,

PITEM varchar2(200),

PDATA date not null

)

partition by range(PDATA)

(

partition part_t01 values less than(to_date('2004-01-01','yyyy-mm-dd')) tablespace dinya_space01,

partition part_t02 values less than(to_date('2008-01-01','yyyy-mm-dd')) tablespace dinya_space02,

partition part_t03 values less than(maxvalue) tablespace dinya_space03

)

insert into Partition_Test(PID,PITEM,PDATA) select h.id,h.userid,h.rectime from st_handle h

select * from Partition_Test partition(part_01) t where t.pid = '1961'

--hash 分區(qū)技術

create table Partition_HashTest

(

PID number not null,

PITEM varchar2(200),

PDATA date not null

)

partition by hash(PID)

(

partition part_h01 tablespace dinya_space01,

partition part_h02 tablespace dinya_space02,

partition part_h03 tablespace dinya_space03

)

insert into Partition_HashTest(PID,PITEM,PDATA) select h.id,h.userid,h.rectime from st_handle h

select * from Partition_HashTest partition(part_h03) t where t.pid = '1961'

--復合分區(qū)技術

create table Partition_FHTest

(

PID number not null,

PITEM varchar2(200),

PDATA date not null

)

partition by range(PDATA) subpartition by hash(PID) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)

(

partition part_fh01 values less than(to_date('2004-01-01','yyyy-mm-dd')) tablespace dinya_space01,

partition part_fh02 values less than(to_date('2008-01-01','yyyy-mm-dd')) tablespace dinya_space02,

partition part_fh03 values less than(maxvalue) tablespace dinya_space03

)

insert into Partition_FHTest(PID,PITEM,PDATA) select h.id,h.userid,h.rectime from st_handle h

select * from Partition_FHTest partition(part_fh02) t where t.pid = '1961'

select * from Partition_FHTest partition(part_fh03) t

--速度比較

select * from st_handle h where h.rectime > to_date('2008-01-01','yyyy-mm-dd');

select * from Partition_FHTest partition(part_fh03) t where t.pdata > to_date('2008-01-01','yyyy-mm-dd');

--分區(qū)表操作

--增加一個分區(qū)

alter table Partition_Test add partition part_05 values less than (10020) tablespace dinya_space03

--查詢分區(qū)數(shù)據(jù)

select * from Partition_FHTest partition(part_fh02) t

--修改分區(qū)里的數(shù)據(jù)

update Partition_FHTest partition(part_fh02) t set t.PITEM = 'JZHUA' where t.pid = '1961'

--刪除分區(qū)里的數(shù)據(jù)

delete from Partition_FHTest partition(part_fh02) t where t.pid = '1961'

--合并分區(qū)

create table Partition_HB

(

PID number not null,

PITEM varchar2(200),

PDATA date not null

)

partition by range(PID)

(

partition part_01 values less than(50000) tablespace dinya_space01,

partition part_02 values less than(100000) tablespace dinya_space02,

partition part_03 values less than(maxvalue) tablespace dinya_space03

)

insert into Partition_HB(PID,PITEM,PDATA) select h.id,h.userid,h.rectime from st_handle h

select * from Partition_HB partition(part_03) t where t.pid = '100001'

alter table Partition_HB merge partitions part_01,part_02 into partition part_02;

--拆分分區(qū)

-- spilt partition 分區(qū)名 at(這里是一個臨界區(qū),比如:50000就是說小于50000的放在part_01,而大于50000的放在part_02中)

alter table Partition_HB split Partition part_02 at (50000) into (Partition part_01 tablespace dinya_space01, Partition part_02 tablespace dinya_space02);

--更改分區(qū)名

alter table Partition_HB rename Partition part_01_test to part_02;

五、Oracle索引分區(qū)表操作

分區(qū)表和一般表一樣可以建立索引,分區(qū)表可以創(chuàng)建局部索引和全局索引。當分區(qū)中出現(xiàn)許多事務并且要保證所有分區(qū)中的數(shù)據(jù)記錄的唯一性時采用全局索引。全局索引建立時 global 子句允許指定索引的范圍值,這個范圍值為索引字段的范圍值。其實理論上有3中分區(qū)索引。

索引分區(qū)是在您建立了表分區(qū)后,要建索引就必須是建立索引分區(qū)。分2大類:一類是把索引信息建立在各個分區(qū)上,這叫局部索引分區(qū)(或叫本地索引分區(qū))。另一類是把索引集中起來,叫全局索引。

Global索引(全局索引):

對于 global 索引,可以選擇是否分區(qū),而且索引的分區(qū)可以不與表分區(qū)相對應。當對分區(qū)進行維護操作時,通常會導致全局索引的 Invalid,必須在執(zhí)行完操作后 Rebuild。Oracle9i 提供了 Update Global Indexes 語句,可以在進行分區(qū)維護的同時重建全局索引。

1:索引信息的存放位置與父表的Partition(分區(qū))信息完全不相干。甚至父表是不是分區(qū)表都無所謂的。

create index dinya_idx_t on dinya_test(item_id) global partition by range(item_id) (

partition idx_1 values less than (1000) tablespace dinya_space01,

partition idx_2 values less than (10000) tablespace dinya_space02,

partition idx_3 values less than (maxvalue) tablespace dinya_space03

);

2:但是在這種情況下,如果父表是分區(qū)表,要刪除父表的一個分區(qū)都必須要更新Global Index ,否則索引信息不正確

ALTER TABLE TableName DROP PARTITION PartitionName Update Global Indexes

建立方法:

create index ind_2 on sales (amount_sold)

global partition by range (amount_sold)

(partition d1 ,

partition d2);

因為全局索引的首個字段必須是range字段,所以就無所謂前綴和非前綴了,都是前綴。

經(jīng)過試驗,我覺得建立全局索引的速度要略遜于局部前綴索引。

也可能是我的能力問題,現(xiàn)在覺得建立分區(qū)還不然不建立索引。如果大家能給我解惑

Local索引(局部索引):

對于 local 索引,每一個表分區(qū)對應一個索引分區(qū)(就是說一個分區(qū)表一個字段只可以建一個局部索引),當表的分區(qū)發(fā)生變化時,索引的維護由 Oracle 自動進行;

1:索引信息的存放位置依賴于父表的Partition(分區(qū))信息,換句話說創(chuàng)建這樣的索引必須保證父表是Partition(分區(qū)),索引信息存放在父表的分區(qū)所在的表空間。

2:但是僅可以創(chuàng)建在父表為HashTable或者composite分區(qū)表的。

3:僅可以創(chuàng)建在父表為HashTable或者composite分區(qū)表的。并且指定的分區(qū)數(shù)目要與父表的分區(qū)數(shù)目要一致。

create index dinya_idx_t on dinya_test(item_id) local (

partition idx_1 tablespace dinya_space01,

partition idx_2 tablespace dinya_space02,

partition idx_3 tablespace dinya_space03

);

不指定索引分區(qū)名直接對整個表建立索引

create index dinya_idx_t on dinya_test(item_id);

建立方法:

create index ind_1 on dept (deptno)

local

(partition d1 ,

partition d2);

(1)局部前綴索引分區(qū)和局部非前綴分區(qū)。如果您擬建立的索引的首個字段,和進行分區(qū)時的range列一樣,那就是局部前綴索引分區(qū)。

優(yōu)點是:理論上(我認為的),比方說您以年代為range分區(qū),2007年一個分區(qū)、2008年一個分區(qū),然后您又在這個時間列上建立了局部前綴索引分區(qū),那么ORACLE就會直接利用這個區(qū)上的索引僅進行這個分區(qū)上的搜索,所以效率會很高。

在我建立的2000萬的表中進行查詢,實踐是,這個局部前綴復合索引的花銷cost是5,而沒有分區(qū)前是4。當然這也無所謂了。又進行了其他幾個查詢,其cost都相差無幾。

(2)局部非前綴索引。如果您建立索引的列的首個字段不是range列,那么就叫局部非前綴索引。

優(yōu)點是:如果您查一個電話號碼,它在每年都會出現(xiàn),當您要count匯總時,這種索引就會同時把這幾個分區(qū)進行并行處理查詢,速度理論上要快。

但我的試驗比較令我失望:我建了一個2000萬的無分區(qū)的表,然后把這個表又復制了一遍,進行了6個分區(qū)。但結果在對某列進行查詢統(tǒng)計時,如果在一個分區(qū),兩者速度相差不大,分區(qū)的查詢速度是:0.25m,無分區(qū)的查詢速度是:0.065m。但在我期望的跨區(qū)統(tǒng)計時,分區(qū)的第一次統(tǒng)計時間是:61.875m,第二次是:10m;而無分區(qū)的表僅為:3.703m。

文章評論

總結

以上是生活随笔為你收集整理的oracle分区表编程,Oracle分区表详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。