通過設置 10104 trace name context forever, level 2 事件,可輸出 Hash Join 構建階段的桶分佈統計,直觀揭示數據傾斜對 Join 性能的影響。本文對比兩組實驗:低重復鍵 vs 高重復鍵,量化分析桶分佈差異。
-- 建表並收集統計
create table t1 as select * from dba_objects;
create table t2 as select * from dba_objects;
insert into t2 select * from dba_objects;
commit;
exec dbms_stats.gather_table_stats(user,'t1');
exec dbms_stats.gather_table_stats(user,'t2');
alter session set tracefile_identifier = 'gg_20150618';
alter session set events '10104 trace name context forever, level 2';
select count(1) from t1,t2 where t1.object_id = t2.object_id;
alter session set events '10104 trace name context off';
關鍵統計:
結論:數據均勻分佈,桶衝突極少,Hash Join 效率極高。
alter session set tracefile_identifier = 'gg_20150619';
alter session set events '10104 trace name context forever, level 2';
select count(1) from t1,t2 where t1.object_type = t2.object_type;
alter session set events '10104 trace name context off';
關鍵統計:
結論:極嚴重的數據傾斜,絕大多數行集中在極少數桶,導致探針階段大量比較,性能急劇下降。
| 指標 | 含義 | 優化方向 |
|---|---|---|
| Max rows in a bucket | 單桶最大行數,反映最嚴重傾斜 | 降低此值:打散數據、增加桶數、使用 Broadcast Join |
| Avg rows in non-empty buckets | 非空桶平均行數 | 接近 1 為理想,>10 需關注 |
| Empty buckets % | 空桶比例 | 過高說明桶數過多或數據極度傾斜 |
METHOD_OPT=>'FOR COLUMNS SIZE 254 object_type',讓優化器識別傾斜並選擇 Broadcast/Nested Loop。/*+ LEADING(t1) USE_HASH(t2) */ 或 /*+ NO_SWAP_JOIN_INPUTS(t2) */ 控制構建/探針端。hash_area_size 或 pga_aggregate_target,減少分區溢寫磁盤。PARALLEL Hint 分散構建負載。