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

gbase慢sql优化案例

Sql: select

a.u_id,

b.b_id,

c.c_id,

from a.a a

left join b.b b on a.u id=b.u_id

left join c.c c on b.c_id=c.c_id

limit 100000;

首先把 sql 拿到生产测试发现确认要很长时间,跑了几分钟根本跑不出来。


尝试去除一个 left join 条件,等了一会跑出来了



耗时 1 分 50 秒



再看表数据量

a 表 四万条记录


b 表将近八千万条记录

查询方式也符合查询逻辑 大小表关联查询一般用小表驱动大表

尝试用 in 看能不能快点


有一定的提升 但是根据业务逻辑需要用到 b 表中很多的字段 而 in 后面的字段 只能有一个 。

改变思路 看表的分布方式

复制表:isReplicate=YES

hash 分布表:hash_column= col_name,分布键是 col_name

随机分布表:isReplicate=NO,hash_column=null

可以看到小表 a 是随机分布表

大表 b 是哈希分布表

再看执行计划



显示界面主要组成部分:

ID:SQL 执行步骤,顺序从下向上

MOTION:某个步骤的结果处理方式

OPERATION:某个步骤内的具体执行操作

TABLE:某个 operation 涉及的表

CONDITION:某个 operation 操作涉及的条件

可以看到 Motion 列有个 BROADCAST 步骤

因为小表是随机分布 即使大表是哈希分布也无法走分布键 所以小表拉了复制表

这个笔者理解应该是类似重广播 就是每一个节点都会有一份复制表

测试如果小表加上分布键会不会提升查询速度

因为 Gbase 无法在表建成后加分布键 所以新建一张测试表


需要注意括号内的字段加单引号

再将数据导入

测试

结果是毫秒级 如果不加分布键则需要 1 分 50 秒

再看执行计划

没有了 BROADCAST 这个步骤

将结果与建议反馈业务侧

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

评论