ITPub博客

首页 > 数据库 > 数据库开发技术 > openGauss学习笔记-278 openGauss性能调优-实际调优案例07-改写SQL消除子查询(案例2)

openGauss学习笔记-278 openGauss性能调优-实际调优案例07-改写SQL消除子查询(案例2)

原创 数据库开发技术 作者:shuchaoyang 时间:2024-01-25 07:00:00 0 删除 编辑

openGauss学习笔记-278 openGauss性能调优-实际调优案例07-改写SQL消除子查询(案例2)278.1 现象描述278.2 优化说明

openGauss学习笔记-278 openGauss性能调优-实际调优案例07-改写SQL消除子查询(案例2)

278.1 现象描述

如下SQL语句:

UPDATE normal_date n SET time = (
   SELECT time FROM normal_date_part p WHERE p.id = n.id
)
WHERE EXISTS
   (SELECT 1
   FROM normal_date_part n2
   WHERE n2.id = n.id);

计划为:

                                                                           QUERY PLAN


----------------------------------------------------------------------------------------------------------------------------------------------------------------
Update on normal_date n  (cost=224.40..2334150.22 rows=5129 width=16) (actual time=17.336..42944.734 rows=10000 loops=1)
  ->  Hash Semi Join  (cost=224.40..2334150.22 rows=5129 width=16) (actual time=16.997..42852.967 rows=10000 loops=1)
        Hash Cond: (n.id = n2.id)
        -> Seq Scan on normal_date n  (cost=0.00..160.29 rows=5129 width=10) (actual time=0.113..7.271 rows=10000 loops=1)
        ->  Hash  (cost=160.29..160.29 rows=5129 width=10) (actual time=7.381..7.381 rows=10000 loops=1)
              Buckets: 32768 Batches: 1 Memory Usage: 430kB
              -> Seq Scan on normal_date n2  (cost=0.00..160.29 rows=5129 width=10) (actual time=0.052..3.501 rows=10000 loops=1)
        SubPlan 1
          ->  Partition Iterator  (cost=0.00..455.00 rows=1 width=8) (actual time=21006.481..42756.884 rows=10000 loops=10000)
                Iterations: 331
                -> Partitioned Seq Scan on normal_date_part p  (cost=0.00..455.00 rows=1 width=8) (actual time=27228.532..27261.944 rows=10000 loops=3310000)
                      Filter: (id = n.id)
                      Rows Removed by Filter: 99990000
                      Selected Partitions:  1..331
Total runtime: 42947.153 ms
(15 rows)

278.2 优化说明

很明显,执行计划中存在SubPlan,并且SubPlan中的运算相当重,即此SubPlan是一个明确的性能瓶颈点。

根据SQL语意等价改写SQL消除SubPlan如下:

update normal_date n set time = (
   select time from normal_date_part p where p.id = n.id
);


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我吧!


原文作者:超哥的IT私房菜;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
专注于IT系统集成、运维、架构二十年的IT职场老兵,拥有CCNA、OCA、OCP、PGCA、PGCE认证证书,公众号:超哥的IT私房菜,知识星球:超哥的IT私房菜,目前是多家IT厂商的咨询顾问。

注册时间:2021-08-27

  • 博文量
    552
  • 访问量
    303618