標籤: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).分區把一個大段分為更多的小片段,可以降低爭用。
本文出自 “srsunbing” 部落格,請務必保留此出處http://srsunbing.blog.51cto.com/3221858/1670678
Oracle Hash分區的使用總結