溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle Hash分區(qū)的使用總結

發(fā)布時間:2020-07-28 21:04:57 來源:網(wǎng)絡 閱讀:5078 作者:srsunbing 欄目:關系型數(shù)據(jù)庫


   近期項目需要用到分區(qū)表,但是分區(qū)鍵值有無法確定,因此只能使用hash分區(qū)(range、list分區(qū)以前常用,比hash分區(qū)簡單),查詢了文檔,發(fā)現(xiàn)上面說的和實際使用時有點差距,就專門做實驗驗證下。


官方文檔(11g、12c的解釋都是一樣的):

docs.oracle.com/database/121/CNCPT/schemaob.htm

Hash Partitioning

  In hash partitioning, the database maps rows to partitions based on a hashing algorithm that the database applies to the user-specified partitioning key. The destination of a row is determined by the internal hash function applied to the row by the database. The hashing algorithm is designed to distribute rows evenly across devices so that each partition contains about the same number of rows.

   Hash分區(qū)時,數(shù)據(jù)庫根據(jù)hash算法映射行到用戶指定的分區(qū)鍵中。行的存放目的地由數(shù)據(jù)庫的內部hash函數(shù)來決定。hash算法的目的是在設備上均勻分布行,以便每個分區(qū)包含相同數(shù)量的行。


建表如下:

create table t_test_part(

  id        number,

  pro_num   varchar2(40), 

  app_type  varchar2(40),

  ...............

)

partition by hash(pro_num)

(

 partition part_01,

 partition part_02,

 partition part_03,

 partition part_04,

 partition part_05,

 partition part_06,

 partition part_07,

 partition part_08

)

tablespace DDS_DATA

  pctfree  10

  initrans 2

  maxtrans 255

storage

(

  initial 64K

  next    64k

  minextents 1

  maxextents unlimited

)

;

加入1000萬數(shù)據(jù),進行各種DML操作,驗證數(shù)據(jù)的存儲和各種性能。


實際結論見下:

1. 數(shù)據(jù)隨機插入

   Hash分區(qū)一般是在分區(qū)鍵值無法確定的情況下,使用的一種分區(qū)策略,Oracle按照hash 算法把數(shù)據(jù)插入用戶指定的分區(qū)鍵中,它是隨機的插入到某個區(qū)中,不受人為的干預。


2. 分區(qū)大小

   分區(qū)的初始大小受建表初始化參數(shù)的影響(即initial、next的影響),不指定時受建庫時表空間參數(shù)的影響。實際分配數(shù)據(jù)后的大小,受分區(qū)字段值的影響。分區(qū)字段值相同時,所有數(shù)據(jù)只能插入到一個分區(qū);分區(qū)字段值不同時,數(shù)據(jù)隨機插入不同的分區(qū)。

    根據(jù)實驗的結果并不是平均分配,也不是每個區(qū)都分配。如上面的表,最少的一個區(qū)只有0.1M,最大的一個區(qū)是33M,嚴重的不均勻。也許隨著時間和數(shù)據(jù)量的不斷增加,數(shù)據(jù)會趨于均衡,估計實驗是很難驗證出來的。


3.  Local和Global索引

   分區(qū)索引分為Local和Global索引,Local索引和表分區(qū)是一一對應的,Global索引又分為Global非分區(qū)索引和Global分區(qū)索引。Global非分區(qū)索引,可以與表分區(qū)對應,也可以不對應;但是當Global分區(qū)索引與表分區(qū)的表空間對應時,則Global分區(qū)索引就是個Local索引。


4. 分區(qū)定值查詢時,Local索引與Global索引沒有任何區(qū)別,但是范圍查詢時,Global索引的partition start 和 partition stop是相同的;Local索引的partition start 和 partition stop 就不同了,上面的那個表是從1到8(和范圍的大小有關)。根據(jù)這個情況,如果實際應用中定值查詢多,就用Local索引了,反之,則用Global索引。如果根本沒法分,那就要權衡了。


5. 分區(qū)與不分區(qū)的區(qū)別

   就我的測試用例來說,兩者沒有本質區(qū)別,時間都相當。 15G的數(shù)據(jù),分區(qū)的SQL語句COST是不分區(qū)時SQL語句COST的幾千倍,不分區(qū)的COST還更低。但是兩者的執(zhí)行時間沒有任何區(qū)別。在實際使用分區(qū)時,性能只是要考慮的一個方面,易管理性、可用性方面分區(qū)還是有很大優(yōu)勢的,不能僅看一面而忽略了整體。

  如:

  1).一個分區(qū)的丟失或損壞不會影響其余的分區(qū),損壞的分區(qū)可以單獨恢復。

  2).分區(qū)把一個大段分為更多的小片段,可以降低爭用。



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI