SQL一多就慢 ? 了解下GaussDB(DWS)中SQL查询计划的stream机制

举报
yd_219384351 发表于 2024/11/05 15:46:25 2024/11/05
【摘要】     分布式数据库理想的运行状态就是 在多个表JOIN的时候,每两个表间的JOIN 都是在本地数据节点上做 join,  而不用重新分布,重分布会带来很大的网络开销, 一旦并发较高的时候,就会出现线程,网络或I/O瓶颈   (比如CBG某平台集群体现为大量线程启动停止申请释放内存及网络卡顿, EBG某集群体现为网络和I/O瓶颈 ) , 当然如果您的SQL是点查,没有表的JOIN (或简单J...

    分布式数据库理想的运行状态就是 在多个表JOIN的时候,每两个表间的JOIN 都是在本地数据节点上做 join,  而不用重新分布,重分布会带来很大的网络开销, 一旦并发较高的时候,就会出现线程,网络或I/O瓶颈   (比如CBG某平台集群体现为大量线程启动停止申请释放内存及网络卡顿, EBG某集群体现为网络和I/O瓶颈 ) , 当然如果您的SQL是点查,没有表的JOIN (或简单JOIN, 都能本地关联,无需重分布) , 且都有较好的索引, 那和传统数据库(比如Oracle)的并发就没有太大差异了   (但是作为数仓产品,这毕竟是少数场景了)   。  

    希望通过stream原理上的了解,在定义表及编写SQL的时候,能充分考虑到 stream 可能发生的场景,尽量减少 stream 的产生, 让SQL更接近分布式数据库的理想状态运行 ,减少异常的发生 。   如果您的SQL执行计划中含有 "Streaming" 关键字超过50  (其实建议是越低越好) , 这个SQL的并发可能会上不去,且可能单个运行时很快,几个类似SQL一起执行性能就会下降比较明显,甚至出现阻塞排队   。  

    Stream过多对于ms级的查询的稳定性影响很大,要尽最大可能消减 。813或以上版本可以通过  max_streams_per_query =50 或其他值来限制SQL的stream。    
目前降低stream可以参考以下三种方式整改:
1.   针对异常SQL中的小表整改成复制表 (不建议无根据全部小表整改为复制表) , 整改方法:  alter table xxx distribute by replication  (注意闲时变更进行 )  。 
2.   检查分布列是否合理,常用的join列是否为分布列。
3.   带with的语句,升级到813后可以通过share scan减少stream数量。
4.   大量uinon 的查询,建议减少SQL中 union个数  。 

注意:     hash表改复制表,有很多需要注意的地方,比如有些表使用了 uuid 作为之前的 hash 分布列 或 作为PK 列,在改为复制表后,由于复制表需要保证所有节点的数据一致, uuid 下推无法保障数据一致, 只能在CN节点先生成再下发DN ,  导致了复制表中包含 uuid 生成的函数就会出现不下推现象 ,不下推会导致 insert 操作一笔笔插入(即使是批量写入也会转换为一笔笔写入),出现小CU膨胀,影响写入和后续查询性能。       可能的方案是 : 不再使用 uuid 等导致不下推的函数 。         

    作为开发人员,如何在开发阶段识别Streaming算子大于50的SQL : 
explain verbose 后面接SQL 语句, 查看执行计划,统计执行计划中的"Streaming" 字样个数,除以2就是这个SQL包括的Streaming算子。 
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。