oracle分割槽技術提高查詢效率

2022-03-09 10:02:58 字數 4357 閱讀 5752

當表中的資料量不斷增大,查詢資料的速度就會變慢,應用程式的效能就會下降,這時就應該考慮對錶進行分割槽。表進行分割槽後,邏輯上表仍然是一張完整的表,只是將表中的資料在物理上存放到多個表空間(物理檔案上),這樣查詢資料時,不至於每次都掃瞄整張表。

下面介紹如何使用分割槽增加查詢效率

range分割槽:就是區域分割槽

create

table

sale

( product_id

varchar2(5

), sale_count

number(10,2))

partition

byrange (sale_count)

( partition p1

values less than (1000

) tablespace cus_ts01,

partition p2

values less than (2000

) tablespace cus_ts02

)

檢視分割槽語法:

select * from user_tab_partitions;--查詢所有分割槽情況,可以接條件where table_name='sale'檢視分割槽表結構

select * from sale partition(p1);--查詢某錶的某一分割槽資料

分割槽後,新增資料的sale_count欄位如果小於1000就儲存到p1分割槽中,如果1000到2000儲存到p2分割槽中。

但是這時如果我們新增的一條資料的sale_count字段值大於2000,將無法儲存到表中。

我們可以擴充套件分割槽,語法如下:

alter table sale add partition p4 values less than(maxvalue);--大於2000的都會存到此分割槽中,當然也可以增加更多的分割槽

同時可以刪除分割槽,語法如下:

alter table sale drop partition p4;--注意:刪除分割槽會把分區內已有的資料同時刪除

但還存在乙個問題,如果現在update分割槽p1中的sale_count值為1500,是不會成功的,需要在update前增加以下語句:

alter table sale enable row movement;--使其row能移動

這樣再update就可以成功了

分割槽之後雖然可以提高查詢的效率,但也僅僅是提高了資料的範圍,所以我們在有必要的情況下,需要建立分割槽索引,從而進一步提高效率。

分割槽索引大體上分為兩大類,一類叫做local,一類叫做global。

local:在每個分割槽上建立索引(一般採用這種方式)

global:一種在全域性上建立索引,這種方式分不分割槽都一樣,一般不使用

下面進行語法演示:

注意:分割槽上建立的索引一定是分割槽字段

create index idx_count on sale(sale_count) local;--建立分割槽索引,在sale表的每個分割槽都建立了索引

select * from user_ind_partitions;--查詢所有分割槽索引情況

全域性索引global寫法就是把上面的local替換成global,但不會使用

有些時候,如果你分割槽分為0~1000,1000~2000,這時如果說0~1500這個範圍內的資料會被頻繁查詢,1500之後查詢很少,那麼就可以使用這種自定義的全域性索引方式對0~1500建立索引,之後的設定maxvalue即可,語法與分割槽語法相似

global自定義全域性索引方式(字首索引):

create index idxname on table(field) global

partition by range(field)

(

partition p1 values less than(value),  .......

partition pn values less than(maxvalue)

);

1.hash分割槽

hash分割槽實現均勻的負載值分配,增加hash分割槽可以重新分布資料,簡單理解就是分割槽直接平均分配

create

table

sale

( product_id

varchar2(5

), sale_count

number(10,2))

partition

byhash (product_id)

( partition p1,

partition p2

)

2.list分割槽

該分割槽的特點是某列的值只有幾個,基於這樣的特點我們可以採用列表分割槽。

create

table

listtable

( id

intprimary

key,

name

varchar (20

), area

varchar (10))

partition

bylist (area)

( partition part1

values ('

guangdong

','beijing

') tablespace part1_tb,

partition part2

values ('

shanghai

','nanjing

') tablespace part2_tb

);

3.復合分割槽(用的不多)

create

table

student(

sno

number

, sname

varchar2(10))

partition

byrange (sno)

subpartition

byhash (sname)

subpartitions 4(

partition p1

values less than(1000

), partition p2

values less than(2000

), partition p3

values

less than(maxvalue)

);

復合分割槽首先大體上分為三個分割槽p1,p2,p3,然後每乙個分割槽內部再進行hash分割槽,分為4份

查詢子分割槽的語句:select * from user_tab_subpartitions where table_name='student';

4.間隔分割槽(工作中常用)

是一種分割槽自動化的分割槽,可以指定時間間隔進行分割槽,這是oracle11g的新特性,實際工作中很常用。實際上是由range分割槽引申的,最終實現了range分割槽的自動化

create

table

interval_sale

(sid

int,sdate timestamp

)partition

byrange(sdate)

interval (numtoyminterval(

1,'month'))

(partition p1

values less than (timestamp

'2017-11-12 00:00:00.00')

)

指定時間之前建立乙個分割槽,之後每隔乙個月建立乙個分割槽

問題:如果我們drop掉了表,那麼這個表的分割槽還存在嗎?

答案是存在的,oracle提供了很強大的資料恢復功能,有乙個類似**站的機制,刪除表後,分割槽以特殊的形式仍然存在user_tab_partitions中,使用purge recyclebin語法後,會清空**站,使用flashback table 表名 to before drop語句可以恢復刪除的表。

oracle分割槽技術提高查詢效率

當表中的資料量不斷增大,查詢資料的速度就會變慢,應用程式的效能就會下降,這時就應該考慮對錶進行分割槽。表進行分割槽後,邏輯上表仍然是一張完整的表,只是將表中的資料在物理上存放到多個表空間 物理檔案上 這樣查詢資料時,不至於每次都掃瞄整張表。下面介紹如何使用分割槽增加查詢效率 range分割槽 就是區...

mysql通過建立分割槽和索引來提高查詢效率

drop table if exists test create table test id int 10 unsigned not null auto increment,time datetime not null comment 業務時間 primary key id time engine ...

Oracle分割槽技術

oracle的分割槽 partitioning option 是一種處理超大型表的技術。分割槽是一種 分而治之 的技術,通過將大表和索引分成可以管理的小塊,從而避免了對每個表作為乙個大的 單獨的物件進行管理,為大量資料提供了可伸縮的效能。分割槽通過將操作分配給更小的儲存單元,減少了需要進行管理操作的...