Oracle Hash分區的使用總結


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


官方文檔(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分區時,數據庫根據hash算法映射行到用戶指定的分區鍵中。行的存放目的地由數據庫的內部hash函數來決定。hash算法的目的是在設備上均勻分佈行,以便每個分區包含相同數量的行。


建表如下:

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萬數據,進行各種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).分區把一個大段分爲更多的小片段,可以降低爭用。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章