GaussDB SQL调优案例-使排序下推


风晓
风晓 2024-01-15 08:57:22 54431 赞同 0 反对 0
分类: 资源 标签: 国产数据库
GaussDB SQL调优案例-使排序下推

现象描述

在做场景性能测试时,发现某场景大部分时间是CN端在做window agg,占到总执行时间95%以上,系统资源不能充分利用。研究发现该场景的特点是:将两列分别求sum作为一个子查询,外层对两列的和再求和后做trunc,然后排序。

表结构如下所示:

  •  
  •  
CREATE TABLE public.test(imsi int,L4_DW_THROUGHPUT int,L4_UL_THROUGHPUT int)with (orientation = columnDISTRIBUTE BY hash(imsi);
查询语句如下所示:
  •  
  •  
  •  
  •  
  •  
  •  
  •  
SELECT COUNT(1) over() AS DATACNT,IMSI AS IMSI_IMSI,CAST(TRUNC(((SUM(L4_UL_THROUGHPUT) + SUM(L4_DW_THROUGHPUT))), 0) ASDECIMAL(20)) AS TOTAL_VOLOME_KPIIDFROM public.test AS testGROUP BY IMSIorder by TOTAL_VOLOME_KPIID DESC;
执行计划如下:
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Row Adapter  (cost=10.70..10.70 rows=10 width=12)   ->  Vector Sort  (cost=10.68..10.70 rows=10 width=12)         Sort Key: ((trunc((((sum(l4_ul_throughput)) + (sum(l4_dw_throughput))))::numeric, 0))::numeric(20,0))         ->  Vector WindowAgg  (cost=10.09..10.51 rows=10 width=12)               ->  Vector Streaming (type: GATHER)  (cost=242.04..246.84 rows=240 width=12)                     Node/s: All datanodes                     ->  Vector Hash Aggregate  (cost=10.09..10.29 rows=10 width=12)                           Group By Key: imsi                           ->  CStore Scan on test  (cost=0.00..10.01 rows=10 width=12)

可以看到window agg和sort全部在CN端执行,耗时非常严重。

优化分析

尝试将语句改写为子查询。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
SELECT COUNT(1) over() AS DATACNT, IMSI_IMSI, TOTAL_VOLOME_KPIIDFROM (SELECT IMSI AS IMSI_IMSI,CAST(TRUNC(((SUM(L4_UL_THROUGHPUT) + SUM(L4_DW_THROUGHPUT))),0) AS DECIMAL(20)) AS TOTAL_VOLOME_KPIIDFROM public.test AS testGROUP BY IMSIORDER BY TOTAL_VOLOME_KPIID DESC);
将trunc两列的和作为一个子查询,然后在子查询的外面做window agg,这样排序就可以下推了,执行计划如下:
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Row Adapter  (cost=10.70..10.70 rows=10 width=24)   ->  Vector WindowAgg  (cost=10.45..10.70 rows=10 width=24)         ->  Vector Streaming (type: GATHER)  (cost=250.83..253.83 rows=240 width=24)               Node/s: All datanodes               ->  Vector Sort  (cost=10.45..10.48 rows=10 width=12)                     Sort Key: ((trunc(((sum(test.l4_ul_throughput) + sum(test.l4_dw_throughput)))::numeric, 0))::numeric(20,0))                     ->  Vector Hash Aggregate  (cost=10.09..10.29 rows=10 width=12)                           Group By Key: test.imsi                           ->  CStore Scan on test  (cost=0.00..10.01 rows=10 width=12)

经过SQL改写,性能由120s提升到7s,优化效果明显。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
风晓L1
粉丝 1 资源 2038 + 关注 私信
最近热门资源
桌面通用(全架构)【在双系统环境下隐藏Windows启动菜单】操作指南  2049
银河麒麟桌面操作系统V10(SP1)2203-如何进行远程桌面互访?  1990
银河麒麟桌面操作系统【保留数据盘重装系统】  1800
麒麟系统各种原因开不了机解决(合集)  1575
桌面通用(全架构)【rpm包转成deb包】操作方法  930
银河麒麟桌面操作系统 V10-SP1 双系统安装 efi 分区问题  914
统信系统安装(合集)  852
统信桌面专业版【手动分区安装UOS系统】介绍  844
统启动异常几种类型(initramfs 模式)  687
最近下载排行榜
桌面通用(全架构)【在双系统环境下隐藏Windows启动菜单】操作指南 0
银河麒麟桌面操作系统V10(SP1)2203-如何进行远程桌面互访? 0
银河麒麟桌面操作系统【保留数据盘重装系统】 0
麒麟系统各种原因开不了机解决(合集) 0
桌面通用(全架构)【rpm包转成deb包】操作方法 0
银河麒麟桌面操作系统 V10-SP1 双系统安装 efi 分区问题 0
统信系统安装(合集) 0
统信桌面专业版【手动分区安装UOS系统】介绍 0
统启动异常几种类型(initramfs 模式) 0
作者收入月榜
1

prtyaa 收益393.72元

2

zlj141319 收益220.97元

3

1843880570 收益214.2元

4

IT-feng 收益213.03元

5

风晓 收益208.24元

6

777 收益172.82元

7

Fhawking 收益106.6元

8

信创来了 收益105.89元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!