用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 增加子查詢表條件篩選提高效能
- 教你幾招HASH表查詢的方法
- Gbase8d如何提高查詢效能?
- 提升50%!Presto如何提升Hudi表查詢效能?REST
- 提高跨庫查詢速度,你只需一個Smartbi
- 用HBase做高效能鍵值查詢?
- 順序表應用6:有序順序表查詢
- 單表查詢
- MySQL連線查詢驅動表被驅動表以及效能優化MySql優化
- [20181130]hash衝突導致查詢緩慢.txt
- 在laravel中使用mysql fulltext全文索引代替like查詢提高效能LaravelMySql索引
- 【效能】Oracle表並行對邏輯遷移後查詢效能的影響Oracle並行
- EntityFramework優化:查詢效能Framework優化
- 查詢 - 符號表符號
- MySQL 單表查詢MySql
- MySQL單表查詢MySql
- JPA 連表查詢
- mysql鎖表查詢MySql
- 十一 GBase 8a MPP Cluster後設資料查詢
- 資料庫基礎查詢--單表查詢資料庫
- MySQL 查詢表所有列名,並用逗號分隔MySql
- spring data jpa 多對一聯表查詢Spring
- mysql 從一個表中查詢,插入到另一個表中MySql
- 效能優化之分頁查詢優化
- MySQL 查詢效能分析之 ExplainMySqlAI
- MySQL查詢效能最佳化MySql
- ClickHouse的查詢效能優勢
- MySQL 合併查詢union 查詢出的行合併到一個表中MySql
- 使用 Traefik 提高 WebSocket 應用效能Web
- 剖析Elasticsearch的IndexSorting:一種查詢效能優化利器ElasticsearchIndex優化
- 查詢效能提升3倍!Apache Hudi 查詢優化了解下?Apache優化
- 查詢資料庫每個表佔用的大小資料庫
- Spring JPA 聯表查詢Spring
- oracle 例項表查詢Oracle
- 查詢表中所有列名
- oracle表複雜查詢Oracle
- Mongodb 關聯表查詢MongoDB
- 提高 Laravel Eloquent 查詢的5個小技巧Laravel