用hash cluster表提高查詢效能 (一)

space6212發表於2019-05-05
cluster可以把一個或者多個表的資料按照鍵值聚合在一起,在很多應用場景能提高查詢效能。
cluster可以為B*Tree cluster也可以是hash cluster,這篇文章主要討論hash cluster。
[@more@]一、hash cluster重要引數

與傳統的表不同,cluster在建立的時候就要定好大小,預先分配空間,這個步驟至關重要。如果空間分配過大,則會導致空間浪費,如果過小,會導致塊溢位(同一個hash key分佈在不同的block中),從而導致IO增大。
那麼,如何合理設定空間呢?這就需要合理設定hashkeys和size兩個引數了。

hashkeys: cluster預期的唯一鍵值的數量(count(distinct hash_key))
size: 平均每個唯一鍵值的大小。假設一個鍵值對應10行,每行大小為100位元組,則size = 10*100=1000

hash cluster在初始化分配空間的時候,分配空間的大小的計算公式是:hashkeys * trunc(block_size/size)

下面透過一個例項來說明如何計算hashkeys和size的大小:

1) 得到行數、平均行長、資料塊數量
SQL> select num_rows,AVG_ROW_LEN,blocks from dba_tables where table_name='USERS';

NUM_ROWS AVG_ROW_LEN BLOCKS
---------- ----------- ----------
1305646540 42 4347642


2) 得到有多少個不同的名字個數,這個相當於hashkeys
SQL> select count(distinct name) cnt from USERS;


CNT
-----------------------
100872483

3) 計算cluster的size引數
--計算方法是:size=(平均行長)*(每一個hash key平均對應的個數)
--在這裡有13億資料,有1億不同的值,所以每一個key對應的記錄為1305646540/100872483=13
-
SQL> select 42*(1305646540/100872483) "SIZE" from dual;

SIZE
-------------------------
543.628481

--計算時用的平均行長應稍大於實際平均行長
--如果hash key值在表中是唯一的,則size就簡單了,稍大於平均行長即可

4) 語句以上的資訊,最後cluster可以這樣設定:

--實際的size引數應該稍大於計算出來的值
--如果確定以後資料不再改變,則可設定成與計算值一樣大小
SQL> create cluster hash_cluster (hash_key number(38))
2 pctfree 0
3 hashkeys 100972483
4 size 600
5 single table
6 hash is hash_key;--用雜湊鍵作為雜湊函式


以上方法是基於現有資料進行的,如果沒有資料,可以透過模擬資料或者估算,然後用同樣的方式推算得出。
對於普通的hash cluster,因為涉及到幾個表,在計算hashkeys和size時要把幾個表都考慮進去。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-1040415/,如需轉載,請註明出處,否則將追究法律責任。

相關文章