马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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消除子查询来到达性能调优全流程体验。
|