用hash cluster表提高查詢效能 (一)
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時要把幾個表都考慮進去。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 提高SQL查詢效能SQL
- 增加子查詢表條件篩選提高效能
- 教你幾招HASH表查詢的方法
- MYSQL INNODB中hash查詢表的實現MySql
- Gbase8d如何提高查詢效能?
- 請教如何提高查詢系統的效能?
- NEST LOOP改為HASH JOIN 效能提高6倍OOP
- 提高sql查詢速度SQL
- 提高count查詢速度
- 【索引】Oracle查詢指定索引提高查詢效率索引Oracle
- [MySQL] - 聯表查詢,查詢一個不在另一個表的記錄MySql
- 載入資料順序對HASH SORT CLUSTER效能影響
- 提升50%!Presto如何提升Hudi表查詢效能?REST
- 【效能優化】Oracle 效能優化:降低列值聚簇因子 提高查詢效率優化Oracle
- 提高查詢速度使用materizlizedZed
- 子查詢-表子查詢
- 提高跨庫查詢速度,你只需一個Smartbi
- Oracle提高查詢效率的方法Oracle
- 提高查詢速度方法總結
- 優化sql提高查詢速度優化SQL
- 一次效能問題原因查詢
- 用HBase做高效能鍵值查詢?
- [原]查詢透明表的實用方法
- 【效能最佳化】Oracle 效能最佳化:降低列值聚簇因子 提高查詢效率Oracle
- 順序表應用6:有序順序表查詢
- 查詢oracle效能SQLOracleSQL
- SQL查詢效能分析SQL
- with as 查詢效能記載
- 單表查詢
- 查詢表資訊
- 雜湊表(Hash)的應用
- 使用Bulk Collect提高Oracle查詢效率Oracle
- 查詢一個表的外來鍵
- MySQL連線查詢驅動表被驅動表以及效能優化MySql優化
- 查詢(3)--雜湊表(雜湊查詢)
- 閃回查詢之閃回表查詢
- 提高mysql查詢效率及一些使用技巧記錄MySql
- 查詢一個表的一列插入到另一個表