分割槽表 分割槽索引2 再談

2022-07-03 18:00:13 字數 4763 閱讀 3410

分割槽應用

一般一張表超過2g的大小,oracle是推薦使用分割槽表的。分割槽一般都需要建立索引,說到分割槽索引,就可以分為:全域性索引、分割槽索引,即:global索引和local索引。前者並不對索引進行分割槽(索引也是表結構,索引大了也需要分割槽),而全域性索引可修飾為分割槽索引(我的理解是 分割槽表的分割槽索引),但是和local索引有所區別。前者的分割槽方式完全按照自定義方式去建立,和表結構完全無關,所以對於分割槽表的全域性索引有以下兩幅網上常用的**:

1.1 對於分割槽表的不分割槽索引(這個有點繞,不過就是表分割槽,但其索引不分割槽):

建立語法(直接建立即可):create index on ();

1.2 對於分割槽表的分割槽索引:

建立語法為:

1

create

index inx_tab_partition_col1 on

table_partition(col1)

2 global partition by

range(col1)

3 partition idx_p1 values less than (1000000

),4 partition idx_p2 values less than (2000000

),5 partition idx_p3 values

less than (maxvalue)

6 )

1.3 local索引結構:

建立語法為:create index inx_tab_partition_col1 on table_partition(col1) local;

也可按照分割槽表的的分割槽結構給與一一定義,索引的分割槽將得到重新命名。分割槽上的點陣圖索引只能為local索引,不能為global全域性索引。

對比索引方式

一般使用local索引較為方便,而且維護代價較低,並且local索引是在分割槽的基礎上去建立索引,類似於在乙個子表內部去建立索引,這樣開銷主要是區分分割槽上,很規範的管理起來,在olap系統中應用很廣泛;而相對的global索引是全域性型別的索引,根據實際情況可以調整分割槽的類別,而並非按照分割槽結構一一定義,相對維護代價較高一些,在oltp環境用得相對較多,這裡所謂oltp和olap也是相對的,不是特殊的專案,沒有絕對的劃分概念,在應用過程中依據實際情況而定,來提高整體的執行效能。

何時建分割槽,分割槽類別、索引

1、建立時機

上述已經說明,2g以上的表,oracle推薦建立分割槽。

分割槽的方式根據實際情況而定,才能提高整體效能。

分割槽的字段一定要是經常用以提取資料的字段,否則會在提取過程中導致遍歷多個分割槽,這樣比沒有分割槽還要慢。

分割槽欄位要選擇合適,資料較為均勻分布到各個分割槽,不要太多也不要太少,而且根據分割槽字段可以很快定位到分割槽範圍。

一般情況下,盡量讓業務操作在同乙個分割槽內部完成。

2、分割槽類別

分割槽主要有range、list、hash;

range通過值的範圍分割槽,也是最常用的分割槽,這種分割槽注意在一種變長數字字串中,很多人會導致認為是數字型別,而按照數字區分區,這樣會分布十分不均勻的現象發生。

list是列舉方式進行分割槽,一般作為二級分割槽而存在(當然也可以自己分割槽,oracle 11g後在分割槽上也可以作為主分割槽而存在),在range基礎上,若資料需要繼續分割槽,並且在range基礎上資料量較為固定,只是較大,可以按照一定規則進一步分割槽。 

hash只指定分割槽個數,分割槽細節由oracle完成,增加hash分割槽可以重新分布資料。

注意:分割槽字段不能使用函式轉換後在分割槽,如,將某數字字串字段,先to_numer(col_name)後分割槽。

3、索引類別

大致分:global索引和local索引,前者可以分:global不分割槽索引,和global分割槽索引。

global不分割槽索引一般不太推薦,因為是用一顆大的索引樹來對映乙個表,這個過程,這樣速度不見得比不分割槽快。

global分割槽索引,查詢資料要通過索引,是先定位了索引內部的分割槽,然後在這個分割槽索引中找到rowid,然後回表提取資料。

local索引是和分割槽的個數逐個對應的,可以說先定位分割槽表的分割槽也可以說先定位索引的分割槽,因為他們是一一對應的,找到對應分割槽後,分割槽內部索引資料集合。

4、對應應用

分割槽表、索引、分割槽索引,要利用其效能優勢,最基本就是要提取資料時,要通過它首先將資料的範圍縮小到乙個即使做全盤掃瞄也不會太慢的情況。所以sql一定要有分割槽上的這個欄位的乙個where條件,將資料迅速定位到分割槽內部,而且盡量定位到乙個分割槽裡面(這個和建立分割槽的規則有關係)。建立分割槽本身不提要效能,要用好才可提高效能,在必要的rac集群中,若存在多分割槽提取資料,適當採用並行提取可以提高提取的速度。對於索引部分,這裡也只提到分割槽索引的建立方式以及常見索引的維護方式,對於索引原理理解後會更容易認識到提取資料時的技巧

常用檢視

1、查詢當前使用者下有哪些是分割槽表:

select * from user_part_tables;

2、查詢當前使用者下有哪些分割槽索引:

select * from user_part_indexes;

3、查詢當前使用者下分割槽索引的分割槽資訊:

select * from user_ind_partitions t

where t.index_name=?

4、查詢當前使用者下分割槽表的分割槽資訊:

select * from user_tab_partitions t

where t.table_name=?;

5、查詢某分割槽下的資料量:

select count(*) from table_partition partition(tab_partotion_01);

6、查詢索引、表上在那些列上建立了分割槽:

select * from user_part_key_columns;

7、查詢某使用者下二級分割槽的資訊(只有建立了二級分割槽才有資料):

select * from user_tab_subpartitions;

如果是全域性索引,因為全域性索引的分割槽結構和表可以不一致,若不一致的情況下,會導致整個全域性索引失效,在刪除分割槽的時候,語句修改為:

alter table table_partition drop partition tab_partotion_03 update global indexes;

2、分割槽合併(從中間刪除掉乙個分割槽,或者兩個分割槽需要合併後減少分割槽數量)

3、分隔分割槽(一般分割槽從擴充套件分割槽從分隔)

4、建立新的分割槽(分割槽資料若不能提供範圍,則插入時會報錯,需要增加分割槽來擴大範圍)

一般有擴充套件分割槽的是都是用分隔的方式,若上述建立表時沒有建立tab_partotion_other分割槽時,在插入資料較大時(按照上述建立規則,超過1800000

就應該建立新的分割槽來儲存),就可以建立新的分割槽。

5、修改分割槽名稱(修改相關的屬性資訊):

6、交換分割槽(快速交換資料,其實是交換段名稱指標)

7、清空分割槽資料

8、磁碟碎片壓縮

對分割槽表的某分割槽進行磁碟壓縮,當對分割槽內部資料進行了大量的update、delete操作後,一定時間需要進行磁碟壓縮,否則在查詢時,若通過full scan掃瞄資料,將會把空塊也會掃瞄到,對錶進行磁碟壓縮需要進行行遷移操作,所以首先需要操作:

alter table enable row movement ;

對分割槽表的某分割槽壓縮語法為:

alter table

modify partition shrink space;

對普通表壓縮:

alter table shrink space;

對於索引也需要進行壓縮,索引也是表:

alter index shrink space;

9、分割槽表重新分析以及索引重新分析

對錶進行壓縮後,需要對錶和索引進行重新分析,對錶進行重新分析,一般有兩種方式:

oracle 10g以前,使用:

begin

dbms_stats.gather_table_stats(user,upper(''));

end;

oracle 10g後,可以使用:analyze table compute statistics;

索引重新分析,將上述兩種方式分別修改一下,如第一種可以使用:gather_index_stats,而第二種修改為:analyze index即可,不過一般比較常用的

是重新編譯。對於分割槽表並進行了索引分割槽的情況,需要對每個分割槽的索引進行重新編譯,這裡以local索引為例子(其每個索引的分割槽和表分割槽結構相同,預設分割槽名稱和表分割槽名稱相同):alter index rebuild partition ;

對於全域性索引,根據全域性索引鎖定義的分割槽名稱修改即可,若沒有分割槽,和普通單錶索引重新編譯方式相同:alter index rebuild;

10、關聯物件重新編譯

上述對錶、索引進行重新編譯,尤其對錶進行了壓縮後會產生行遷移,這個過程可能會導致一些檢視、過程物件的失效,此時要將其重新編譯一次。

11、擴充套件:hash分割槽中,如果建立了新的分割槽,可以將其進行重新hash分布:alter table coalesca partition%

MySQL分割槽表與索引

一 定義 簡而言之就是將一張邏輯上仍然完整的表,在物理儲存的過程中,將表上的資料按某種指定的劃分依據,在物理上存放到多個 表空間 物理檔案上 這樣查詢資料時,不至於每次都掃瞄整張表而只是從當前的分割槽查到所要的資料,這樣大大提高了資料查詢的速度。優點 缺點 二 分割槽表的原理 其實對儲存引擎來說,底...

移動分割槽表和分割槽索引的表空間

移動分割槽表的表空間 1 非組合分割槽表 alter table rpt f station dp move partition sys p3742 tablespace reportdata 2 組合分割槽表 1 先移動子分割槽到另乙個表空間 alter table rpt f cabecf mo...

把非分割槽表改為分割槽表

把非分割槽表改為分割槽表 說明 把非分割槽表改為分割槽表適用於歷史表 1 建立分割槽表 結構和非分割槽表tbl stock balance log相同 createtabletbl stock balance log part1 account id varchar2 20 byte occur d...