OLAP 大表和小表並行hash join

2021-06-20 17:39:21 字數 993 閱讀 9005

乙個表50mb 

乙個表10gb

50m表做驅動表,放在pga裡

這時候慢在對對 10g 的全表掃瞄

對10個g掃瞄塊 需要開並行

我有這樣乙個演算法

乙個程序 讀 50mb

8程序 來 掃瞄 10gb

乙個 程序掃瞄 1.25gb

50mb 都分發到 8個程序

超大表和小表之間做hash join,一般會啟用用並行,oracle在並行hash join的時候會用到很多技術,比如 hash hash, 或者broadcast

對於超大表和小表做hash join,一定要讓小表進行廣播(broadcast),通常情況下cbo會選擇正確,但是如果統計資訊不准,或者基數計算錯誤cbo選擇了 hash hash join,這個時

候就很慢,觀察現象就是它在做direct path write temp,這個時候就可以用hint pq_distribute 進行調整

pq_distribute(驅動表 none, broadcast) 如果外層表很小(hash_aj),

這個時候可以用 pq_distribute(驅動表 broadcast,none)

下面就是乙個具體的例子, f 是乙個超大表 t 是乙個小表

sql&get; explain plan for select /*+ parallel(f 8) parallel(t 8) use_hash(t,f) full(f) full(t) pq_distribute(f hash, hash) */ *

2 from crs_data_fct f

3 join crs_time_perd_fdim t on t.time_perd_id = f.time_perd_id;

explained.

elapsed: 00:00:00.83

sql&get; select * from table(dbms_xplan.display);

Hash表和Hash衝突

hash表中的元素儲存位址是通過hash函式計算出來的,當要取出指定元素的時候,直接通過hash函式計算出元素的儲存位址。有時候會出現key不同,但是通過hash函式計算出來的值相同,這個值相同意味著這兩個key要存在同一位置,這顯然不對,這就是hash衝突。hash函式有多種構造方法,常見的有直接...

小表驅動大表

類似迴圈巢狀。for int i 5 如果小的迴圈在外層,對於資料庫連線來說就只連線5次,進行5000次操作,如果1000在外,則需要進行1000次資料庫連線,從而浪費資源,增加消耗。這就是為什麼要小表驅動大表。在tb dept bigdata表中插入100條資料,在tb emp bigdata表中...

MySQL 小表驅動大表

小表驅動大表 準備兩站表 create table student id int 11 notnull,no varchar 20 default null name varchar 20 default null primary key id engine innodb default chars...