GBase 8a
其他
文章

如何通过trace判断hash分布导致数据倾斜

发表于2025-12-25 11:04:2722次浏览1个评论

采用hash划分算法时,分给各个线程的数据量可能不成比例,若从trace里发现某个线程明显过多时,可手动改相应的算法,下例取自Feature #36614,是hybrid hash join出现倾斜

09:12:44 traverse dim: 131074 tuples, match dim: 131074 tuples

09:12:44 traverse tuple: total_size = 5, key_size = 1, tuple_size = 4, other_size = 0, pseudo_size = 0

09:12:44 match tuple: total_size = 1, key_size = 1, tuple_size = 0, other_size = 0, pseudo_size = 0

09:12:44 divide to 3 blocks(using round-robin): 65536, 65536, 2.                                                   数据划分3份,即用3个线程来创建hash表

09:12:44 Hybrid hash join: data will be split into 1 partitions      所有数据可以在一轮完成 (1 partitions  )

09:12:44 traverse dim: 131074 tuples, match dim: 65536 tuples

09:12:44 traverse dim: 131074 tuples, match dim: 65536 tuples

09:12:44 traverse dim: 131074 tuples, match dim: 2 tuples

09:12:44 BEGIN hybrid hash join: partition(-1/1): traverse dim: 131074 tuples, match dim: 131074 tuples

09:12:44 ( 2)Sub 0: use 524288+0;      buckets: total 131072, use 0, avg 0.00,     longest 0; rows: add 0            创建了四个子hash表,其中一个avg=0

09:12:44 ( 2)Sub 1: use 524288+393216; buckets: total 131072, use 1, avg 32768.00, longest 32768; rows: add 32768   另外一个平均冲突链达到了32768

09:12:44 ( 2)Sub 2: use 524288+0;      buckets: total 131072, use 0, avg 0.00,     longest 0; rows: add 0

09:12:44 ( 2)Sub 3: use 524288+786456; buckets: total 131072, use 3, avg 21846.00, longest 32768; rows: add 65538

09:12:44 ( 0)Match: scanned 2 rows,   and produced 10925 rows already.            第一个很快,这条trace后长时间不更新

09:14:50 ( 2)Match: scanned 65536 rows,   and produced 1610623661 rows already.   后面由于冲突链太长(avg,longest太大)很慢

09:15:06( 1)Match: scanned 65536 rows,    and produced 1610623658 rows already.

在trace卡住阶段还可以用 sudoperf top 命令观察

若某个函数长时间大于5%,甚至大于10%,就说明卡在这里, 这个例子卡在了hash冲突链遍历。

Samples: 611K of event 'cycles', Event count (approx.): 34603644864                                                               

Overhead  Shared Object                       Symbol                                                                             

16.27%  gbased                              [.] DumpableHashTable::IterateNext hash表遍历下一个冲突链     

  14.24%  gbased                              [.] BlockedRowMemStorage::GetRow

  10.87%  gbased                              [.] Filter::Reset

   8.06%  gbased                              [.] DumpableHashTableIterator::FindNext

gbase> select count(*) from t1 A left join t1 B on A.i = B.i;

+------------+

| count(*)   |

+------------+

| 3221258244 |

+------------+

1 row in set (Elapsed: 00:01:53.15)

换成RR算法后

gbase> set _gbase_hybrid_hash_join=1; 

gbase> select count(*) from t1 A left join t1 B on A.i = B.i;

+------------+

| count(*)   |

+------------+

| 3221258244 |

+------------+

1 row in set (Elapsed: 00:02:17.59)

评论

登录后才可以发表评论
曾浩轩发表于 2个月前
学习了