GaussDB SQL调优之改写SQL消除子查询

[复制链接]
发表于 2025-11-13 01:58:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库,该产物具备企业级复杂事故肴杂负载本领,同时支持优秀的分布式事故,同城跨AZ摆设,数据0丢失,支持1000+扩展本领,PB级海量存储等企业级数据库特性。拥有云上高可用,高可靠,高安全,弹性伸缩,一键摆设,快速备份规复,监控监控告警等关键本领,能为企业提供功能全面,稳固可靠,扩展性强,性能精良的企业级数据库服务。同时华为开源openGauss单机主备社区版本,鼓励更多搭档、开辟者共同繁荣中国数据库生态。
您将会学到什么

在这个Codelabs中,您将体验GaussDb(for openGauss)通过改写SQL消除子查询来到达性能调优的现实案例。
SQL调优指南

SQL调优的唯一目标是“资源使用最大化”,即CPU、内存、磁盘IO、网络IO四种资源使用最大化。全部调优本领都是围绕资源使用开展的。所谓资源使用最大化是指SQL语句只管高效,节流资源开销,以最小的代价实现最大的效益。好比做典范点查询的时间,可以用seqscan+filter(即读取每一条元组和点查询条件举行匹配)实现,也可以通过indexscan实现,显然indexscan可以以更小的代价实现类似的效果。
改写SQL消除子查询

1.征象形貌

表界说如下:
  1. select 1, (select count(*) from customer_address_001 a4 where a4.ca_address_sk = a.ca_address_sk) as GZCS from customer_address_001 a;
复制代码
此SQL性能较差,查察发现实验操持中存在SubPlan

2.优化分析

此优化的核心就是消除子查询。分析业务场景发现a.ca_address_sk不为null,那么从SQL语义出发,可以等价改写SQL为:
  1. ​
  2. select count(*) from customer_address_001 a4, customer_address_001 a where a4.ca_address_sk = a.ca_address_sk group by a.ca_address_sk;
  3. ​
复制代码
分析: 为了包管改写的等效性,在customer_address_001. ca_address_sk加了not null束缚。
3.征象形貌

某局点客户反馈如下SQL语句的实验时间高出1天未竣事:
  1. UPDATE calc_empfyc_c_cusr1 t1 SET ln_rec_count = ( SELECT CASE WHEN current_date - ln_process_date + 1 <= 12 THEN 0 ELSE t2.ln_rec_count END FROM calc_empfyc_c1_policysend_tmp t2 WHERE t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1 ) WHERE dsign = '1' AND flag = '1' AND EXISTS (SELECT 1 FROM calc_empfyc_c1_policysend_tmp t2 WHERE t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1 );
复制代码

4.优化分析

很显着,实验操持中存在SubPlan,而且SubPlan中的运算相称重,即此SubPlan是一个明白的性能瓶颈点。 根据SQL语意等价改写SQL消除SubPlan如下:
  1. UPDATE calc_empfyc_c_cusr1 t1 SET ln_rec_count = CASE WHEN current_date - ln_process_date + 1 <= 12 THEN 0 ELSE t2.ln_rec_count END FROM calc_empfyc_c1_policysend_tmp t2 WHERE t1.dsign = '1' AND t1.flag = '1' AND t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1;
复制代码
改写之后SQL语句在50S内实验完成。
恭喜您

庆祝您,您已经乐成地完成了GasssDB(for openGauss)通过改写SQL消除子查询来到达性能调优全流程体验。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表