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

GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库,该产品具备企业级复杂事务混合负载能力,同时支持优异的分布式事务,同城跨AZ部署,数据0丢失,支持1000+扩展能力,PB级海量存储等企业级数据库特性。拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。同时华为开源openGauss单机主备社区版本,鼓励更多伙伴、开发者共同繁荣中国数据库生态。

您将会学到什么

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

SQL调优指南

SQL调优的唯一目的是"资源利用最大化",即CPU、内存、磁盘IO、网络IO四种资源利用最大化。所有调优手段都是围绕资源使用开展的。所谓资源利用最大化是指SQL语句尽量高效,节省资源开销,以最小的代价实现最大的效益。比如做典型点查询的时候,可以用seqscan+filter(即读取每一条元组和点查询条件进行匹配)实现,也可以通过indexscan实现,显然indexscan可以以更小的代价实现相同的效果。

改写SQL消除子查询

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为:

​
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;

​

说明: 为了保证改写的等效性,在customer_address_001. ca_address_sk加了not null约束。

3.现象描述

某局点客户反馈如下SQL语句的执行时间超过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如下:

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消除子查询来达到性能调优全流程体验。

相关推荐
m0_748255655 小时前
DuckDB:pg_duckdb集成DuckDB和PostgreSQL实现高效数据分析
数据库·postgresql·数据分析
阿雄不会写代码5 小时前
数据库如何清空重置索引,MySQL PostgreSQL SQLite SQL Server
数据库·mysql·postgresql
猿小喵5 小时前
redo和binlog区别
数据库·mysql
潇湘秦7 小时前
Oracle CDB自动处理表空间不足脚本
数据库·oracle
梓沂7 小时前
Oracle中与 NLS(National Language Support,国家语言支持) 相关的参数
数据库·oracle
angen20187 小时前
mysql 存储过程和自定义函数 详解
数据库·mysql
m0_748249549 小时前
DRGDIP 2.0时代下基于PostgreSQL的成本管理实践与探索(上)
数据库·postgresql·区块链
q567315239 小时前
无法在Django 1.6中导入自定义应用
android·开发语言·数据库·django·sqlite
茂桑10 小时前
Redis的数据过期策略和数据淘汰策略
java·数据库·redis
jambinliang12 小时前
零售行业数据分析工作模式革新
大数据·python·sql·数据分析