Oracle Hash分區的使用總結


   近期項目須要用到分區表,可是分區鍵值有沒法肯定,所以只能使用hash分區(range、list分區之前經常使用,比hash分區簡單),查詢了文檔,發現上面說的和實際使用時有點差距,就專門作實驗驗證下。算法


官方文檔(11g、12c的解釋都是同樣的):數據庫

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

Hash Partitioning
app

  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.ide

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


建表以下:性能

create table t_test_part(測試

  id        number,spa

  pro_num   varchar2(40), htm

  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萬數據,進行各類DML操做,驗證數據的存儲和各類性能。


實際結論見下:

1. 數據隨機插入

   Hash分區通常是在分區鍵值沒法肯定的狀況下,使用的一種分區策略,Oracle按照hash 算法把數據插入用戶指定的分區鍵中,它是隨機的插入到某個區中,不受人爲的干預。


2. 分區大小

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

    根據實驗的結果並非平均分配,也不是每一個區都分配。如上面的表,最少的一個區只有0.1M,最大的一個區是33M,嚴重的不均勻。也許隨着時間和數據量的不斷增長,數據會趨於均衡,估計實驗是很難驗證出來的。


3.  Local和Global索引

   分區索引分爲Local和Global索引,Local索引和表分區是一一對應的,Global索引又分爲Global非分區索引和Global分區索引。Global非分區索引,能夠與表分區對應,也能夠不對應;可是當Global分區索引與表分區的表空間對應時,則Global分區索引就是個Local索引。


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


5. 分區與不分區的區別

   就個人測試用例來講,二者沒有本質區別,時間都至關。 15G的數據,分區的SQL語句COST是不分區時SQL語句COST的幾千倍,不分區的COST還更低。可是二者的執行時間沒有任何區別。在實際使用分區時,性能只是要考慮的一個方面,易管理性、可用性方面分區仍是有很大優點的,不能僅看一面而忽略了總體。

  如:

  1).一個分區的丟失或損壞不會影響其他的分區,損壞的分區能夠單獨恢復。

  2).分區把一個大段分爲更多的小片斷,能夠下降爭用。

相關文章
相關標籤/搜索