暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8a Hash Index Join 使用

原创  2021-04-29
881

一、背景

Hash Index 作为一种传统的索引技术,已经在GBase 8a 数据库产品中得到应用。其通过对某列数据构造hash表,并持久化存储至文件,从而大大降低对这一列数据进行精确查询的时间复杂度。具体应用在 GBase 8a 在单表等于(包含不等于)扫描、‘IN’(包含 NOT IN) 运算等查询过程中已经使用了Hash Index 技术。

EG:

select * from t1 where a = 1;
select * from t1 where a in (1,2,3);

如果 t1 表的a列创建了 hash index,那么引擎在执行上述的单表扫描时,会自动应用 Hash Index 提高查询性能。

二、Hash Index Join 概述

Hash Index Join 适用于等于条件 join,与通用的Hash Join 算法(Hybrid Hash Join 等)有交集,一般可以使用Hash index Join的场景同样可以使用通用Hash Join算法。Hybrid Hash Join 算法作为 GBase 8a常用的算法,适用性和性能得到了平衡。在对Hash Index Join做评价时,默认的对比基准为 Hybrid Hash Join。

SQL1:select * from t1,t2 where t1.a = t2.a;

t1 为大表,行数为 100万行;t2 为小表,行数为 100 行;假设 t1 和 t2 表的 a 列数据充分分散(重复值少)
Hybrid Hash Join 原理:

  1. 使用小表数据构建Hash表
  2. 使用大表数据逐行计算Hash值,与Hash表进行Hash匹配
    image.png

理论上,Hybrid Hash Join 算法的时间复杂度为 O(m+n)

本质上,Hash Index Join 与普通的Hash Join 算法原理相同,不同的是大表 t1 的 hash index是以文件形式存在的,不在需要创建,使用时装在内存即可。因此Hash Index Join 基于 Hash Index实现。
同样使用上面的SQL1为例,大表 t1 的a列构造了Hash Index,同时,小表t2足够小,那么这样的情况下比较适应于Hash Index Join 算法。大表的t1通过Hash Index机制建立的Hash索引,本质上为Hash 表,作为 Traverse表来使用。
Hash Index Join 原理:
image.png
理论上,Hash Index Join 算法的时间复杂度为O(大表行数/32768 * 小表行数)

三、参数设置

  1. gbase_enable_hash_index_join:控制是否启用Hash Index Join功能
    默认值:0 关闭Hash Index Join
    最小值:0
    最大值:1 开启Hash Index Join

  2. gbase_hash_index_join_match_table_rows:指定 Match 表行数的最大值;
    参数说明:Hash Index Join的性能受 Match表的行数影响很大,只有当 Match 表的行数不超过该参数设定的值时允许使用 Hash Index Join
    默认值:2000
    最小值:0
    最大值:不限制
    各项取值意义:
    0:Match表任意行数均允许使用 Hash Index Join
    大于0:Match表行数不超过该值时允许使用 Hash Index Join

四、Hash Index Join 约束

  1. Join条件存在某个表的列有Hash Index
  2. gbase_enable_hash_index_join = 1 且 Match 表行数满足 gbase_hash_index_join_match_table_rows 参数要求

需要同时满足上述的2条条件时才能使用

最后修改时间:2021-04-29 14:40:59
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论