Hologres新手如何基于ChatGPT优化Hologres慢SQL

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
简介: Hologres新手如何基于ChatGPT优化Hologres慢SQL。

Hologress是为全集团TL提供实时OKR分析看板的数据存储及计算库,方便团队TL聚焦重点、统一目标、跟踪进展,做好目标管理及协同。


鉴于最近ChatGPT的火热应用,我们尝试着将Hologres的慢SQL通过ChatGPT调优,有一些有意思的收获,下面给大家分享一下使用教程和使用收获,也希望这个分享能帮助大家在日常工作中利用AI的能力集思广益,释放手工生产力!


工具:Hologres,ChatGPT。作者是用VSCODE安装ChatGPT插件。(开源ChatGPT也可以的)

步骤:

  1. VSCODE 安装ChatGPT中文版
  2. 将Hologres慢SQL的执行计划复制到ChatGPT

VSCODE 安装ChatGPT中文版,将执行计划复制到ChatGPT

机1.png

继续提问:如何优化

机2.png

ChatGPT还不支持自动返回优化脚本,但可以继续问,例如如何创建索引

机3.png

但如果有不清楚的专业名词可以继续提问,例如:PostgreSQL优化全表扫描和数据重新分发操作

机4.png

机5.png

机6.png

通过上面的调优建议和方案,再结合Hologres的官方调优建议,总结出的调优方案如下:

参考Hologres调优文档:

1. 基于ChatGPT的性能调优

1.1 执行计划

执行计划如下:

Limit(cost=0.00..26.95 rows=1 width=16)->  Result  (cost=0.00..26.95 rows=1 width=16)->Limit(cost=0.00..25.95 rows=1 width=24)->  Partial Aggregate  (cost=0.00..25.95 rows=1 width=24)->  Gather  (cost=0.00..25.94 rows=10 width=24)->  Partial Aggregate  (cost=0.00..25.94 rows=10 width=24)->  Result  (cost=0.00..23.19 rows=54569 width=40)->  Result  (cost=0.00..19.39 rows=54569 width=232)->  Hash Right Join(cost=0.00..18.00 rows=54569 width=224)                                                  Hash Cond:(ads_is_rd_okr_emp_pxxxi.work_no= ads_is_rd_okr_emxxxxxe_df_i.work_no)->  Partial HashAggregate  (cost=0.00..11.45 rows=27285 width=167)Group Key: ads_is_rd_okr_xxxf_i.work_no->  Redistribution  (cost=0.00..9.66 rows=27285 width=263)->  Exchange (Gather Exchange)(cost=0.00..8.96 rows=27285 width=263)->  Result  (cost=0.00..8.94 rows=27285 width=263)->  Decode  (cost=0.00..8.94 rows=27285 width=263)->  Partial HashAggregate  (cost=0.00..8.84 rows=27285 width=263)Group Key: ads_is_rd_xxxiod_df_i.work_no->  Seq Scan on ads_is_rd_okxxxx_df_i  (cost=0.00..6.08 rows=27285 width=259)                                                                                            Filter:((COALESCE(is_deleted,'1'::text)<>'Y'::text)AND(period_id = ANY ('{61e79735a,621baa21bd16,621baa7dbd16,6295ffb8,62b122830a33af,630f858094}'::text[])))->  Hash  (cost=5.02..5.02 rows=1000 width=72)->  Redistribution  (cost=0.00..5.02 rows=1000 width=72)->  Seq Scan on ads_is_rd_okr_xxx_df_i  (cost=0.00..5.01 rows=1000 width=72)                                                                    Filter:((dept_full_path ~~'%00001%'::text)AND(s_dept_no = ANY ('{00002,}'::text[])))

1.2 执行计划解读(来自ChatGPT)

  • 首先执行Seq Scan on ads_is_rdxxxt_tree_df_i,对表进行全表扫描。这个操作的代价为5.01,将结果存储在一个Hash表中。
  • 接下来执行Partial HashAggregate,对ads_is_rd_okr_emp_period_df_i表进行聚合操作,将work_no相同的记录合并在一起。这个操作的代价为8.84。
  • 然后执行Decode,对ads_is_xxxx_df_i表进行解码操作。这个操作的代价为8.94。
  • 然后执行Result操作,将ads_is_rdxxxxdf_i表的结果发送给Exchange节点。这个操作的代价为8.94。
  • 然后执行Exchange(Gather Exchange)操作,将Exchange节点的结果聚集到一个节点上。这个操作的代价为8.96。
  • 然后执行Redistribution操作,对数据进行重新分发。这个操作的代价为9.66。
  • 然后执行Partial HashAggregate,对adxxxxxd_df_i表进行聚合操作,将work_no相同的记录合并在一起。这个操作的代价为11.45。
  • 然后执行Hash Right Join操作,对ads_is_xxxe_df_i和ads_is_rdxxxxx_df_i进行哈希连接。这个操作的代价为18.00
  • 然后执行Result操作,将结果发送给Limit节点。这个操作的代价为19.39。
  • 然后执行Result操作,将结果发送给Limit节点。这个操作的代价为23.19。
  • 然后执行Partial Aggregate操作,对结果进行聚合操作。这个操作的代价为25.95。
  • 最后执行Limit操作,返回结果集中的前1条记录。这个操作的代价为26.95。

综上所述,这段执行计划的主要操作是对两个表进行聚合和连接操作,其中大量使用了哈希表和哈希连接来优化查询性能。同时,在执行计划中还出现了全表扫描和数据重新分发等操作,代价较高。需要进一步优化查询语句和数据结构,以提高查询性能和效率。


2. 优化方案(结合ChatGPT)

根据ChatGPT的解读和优化建议,再根据Hologres的调优建议,最终总结出来慢SQL的优化方案如下:

2.1 修改表存储模式和加索引

ChatGPT:在查询语句中使用到的字段上添加索引,可以减少全表扫描的操作,提高查询性能。

优化手段:将Hologres行存储表改成列存储表,并加上索引。

温馨提示:行存储表不能直接改列存储表,可以先复制一张备份表B,改成列存储,在通过rename方式,把A换成C,B换成A,这样达到删表重建效果,不影响线上)

机7.png

改列存储原因:1. 存储模式提示文案修改:Hologres支持列存、行存和行列共存3种存储模式。默认为列存,列存适合各种OLAP场景的复杂查询;行存适用于适用于基于主键(PK)的KV查询场景。行列共存则同时适用列存和行存的场景。

机8.png


先复制一张备份表B:

机9.png

改成列存储:

机10.png

通过rename方式完成删表重建功能,不影响线上

机11.png

第一个慢SQL优化后时间缩短一半:

机12.png

第二个慢SQL优化前:

机13.png

第二个慢SQL优化后:

机14.png

2.2 调整查询条件

ChatGPT:在查询语句中添加合适的查询条件,过滤掉不必要的记录,减少数据处理的代价。

优化手段:暂时还没有做这一步,因为查询性能已经达到要求了。

2.3 调整数据分布

ChatGPT:调整数据分片的方式,让相同的数据均匀地分布在不同的节点上,避免数据重新分发的操作。

优化手段:

  • 将join的key或者group by 频繁的key设置成distribution key,这样实现local join的能力,减少执行计划中的redistribution key(因为涉及的改动较多,所以这次没有改动了)
  • 将查询条件用到的字段bitmap和dictionary都设置为on。因为表的字段长度都很长,设置bitmap和dictionary会加快查询。
BEGIN;CALL UPDATE_TABLE_PROPERTY('public.ads_is_rd_okr_emp_period_df_i','dictionary_encoding_columns','"is_deleted:on","period_id:on"');CALL UPDATE_TABLE_PROPERTY('public.ads_is_rd_okr_emp_period_df_i','bitmap_columns','"is_deleted:on","period_id:on"');COMMIT;
  • 字典编码列:字典编码列,即dictionary_encoding_columns,为该列构建字典编码映射。字典编码可以将字符串的比较转成数字的比较,加速group by、filter等查询。默认所有text列设置为auto模式,系统基于字段基数自动判断是否生成字典编码,建表后可修改。
  • 位图列:位图列,即bitmap_columns,为该列构建bitmap索引。bitmap索引可以对数据进行快速的等值过滤,建议把等值查询列建成位图列。默认所有 text 列都会被隐式地设置到bitmap_columns中,建表后可修改。

调整前:

机15.png

调整后:减少5毫秒

机16.png

3. 优化后效果

根据建议优化后:从早上10点半优化后,访问人数最高到8.32,没有出现一条慢SQL,而前一天半小时内慢SQL能达到上千条。

机17.png

附上测试同学对我调优之后的压测报告:

机18.png

4. 总结

以上是我根据ChatGPT做的部分慢SQL调优,取得一些比较好的反馈。但是上述分享只是我个人的经验所得,实际调优请以Hologres官方文档为准,这次分享的核心目的是希望在释放手工生产力提升工作效率方面有更多的思路。


说明:本文为业务方基于兴趣总结的经验,仅供参考,实际SQL调优请以Hologres官网文档为准。


相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
相关文章
|
1月前
|
数据采集 人工智能 程序员
PHP 程序员如何为 AI 浏览器(如 ChatGPT Atlas)优化网站
OpenAI推出ChatGPT Atlas,标志AI浏览器新方向。虽未颠覆现有格局,但为开发者带来新机遇。PHP建站者需关注AI爬虫抓取特性,优化技术结构(如SSR、Schema标记)、提升内容可读性与语义清晰度,并考虑未来agent调用能力。通过robots.txt授权、结构化数据、内容集群与性能优化,提升网站在AI搜索中的可见性与引用机会,提前布局AI驱动的流量新格局。
107 8
|
1月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
183 6
|
9月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
6月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
8月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
8月前
|
存储 SQL Java
Flink CDC + Hologres高性能数据同步优化实践
本文整理自阿里云高级技术专家胡一博老师在Flink Forward Asia 2024数据集成(二)专场的分享,主要内容包括:1. Hologres介绍:实时数据仓库,支持毫秒级写入和高QPS查询;2. 写入优化:通过改进缓冲队列、连接池和COPY模式提高吞吐量和降低延迟;3. 消费优化:优化离线场景和分区表的消费逻辑,提升性能和资源利用率;4. 未来展望:进一步简化用户操作,支持更多DDL操作及全增量消费。Hologres 3.0全新升级为一体化实时湖仓平台,提供多项新功能并降低使用成本。
671 1
Flink CDC + Hologres高性能数据同步优化实践
|
9月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
430 9
|
8月前
|
SQL 存储 监控
Hologres诊断与优化快速入门
本文由赵红梅(Hologres PD)撰写,分享如何利用诊断与调优工具提升SQL和数据库异常的全方位诊断能力,增强实例稳定性。内容涵盖五个部分:事前通过监控指标实时监控;事中通过活跃日志发现并处理问题;事后通过慢Query日志与Query洞察诊断性能瓶颈;成本治理借助表管理工具优化资源;以及利用诊断工具实现长期稳定性治理。具体包括CPU、内存、I/O等监控指标设置,慢Query优化,错Query治理,SQL诊断报告生成,表Meta问题修复及表索引诊断报告的应用,全面覆盖实例监控、问题定位、性能优化和成本控制等方面。
|
10月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
11月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
279 11

相关产品

  • 实时数仓 Hologres