前一陣子一直在研究着Oracle的表分區的相關知識。在數據量不斷擴大的現在,分區技術是一種非常有效的提高效率的技術。
限於業務的原因,我以前每次建立分區表的時候都喜歡用日期進行分區,每天一個range分區。但是突然有一天我遇到了一個很討厭的表,是一個對應關系表,只有產品和銷售品的對應關系,這個樣子的表是沒有辦法建立我最熟悉的range分區的,經過我查閱資料以后我發現hash分區是一個比較好的解決方案。
hash分區就是對分區字段進行hash運算后,將數據均勻的分布在每一個分區上。hash,在大學的時候數據結構課上學過,意思是雜湊,聽這個名字就知道這個方法無比適合。
新學的分區語句:
CREATE TABLE TEST PARTITION BY HASH(object_id) PARTITIONS 8 AS SELECT * FROM dba_objects;
這樣子的話,系統會自動的生成8個分區,每一個分區的名字也是系統指定的:
至於為什么從21開始分我還真的不理解,以后再說吧。
可以查查每一個分區中有多少數據,range分區很好查,按分區列條件查就好了,這個hash不行,我查了一下,語句如下:
select count(1) from test partition(sys_p21);
下面是這些個分區中的數據量:
效果非常好。
接下來就是看看數據的查詢效率了。首先要對這個表進行一次analyze。然后autotrace一下這個執行計划,如下:
做實驗要有一個對照組,下面新建一個沒有分區的表,數據和test一樣,這個表叫做test_2,然后插入數據,然后analyze,然后看執行計划:
效果非常非常好,對於那種亂七八糟的表這個分區方法簡直碉堡了。