现象描述
select 1, (select count(*) from normal_date n where n.id = a.id) as GZCS from normal_date a; |
此SQL性能较差,查看发现执行计划中存在SubPlan,具体如下:
QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------- Seq Scan on normal_date a (cost=0.00..888118.42 rows=5129 width=4) (actual time=2.394..22194.907 rows=10000 loops=1) SubPlan 1 -> Aggregate (cost=173.12..173.12 rows=1 width=8) (actual time=22179.496..22179.942 rows=10000 loops=10000) -> Seq Scan on normal_date n (cost=0.00..173.11 rows=1 width=0) (actual time=11279.349..22159.608 rows=10000 loops=10000) Filter: (id = a.id) Rows Removed by Filter: 99990000 Total runtime: 22196.415 ms (7 rows) |
优化说明
此优化的核心就是消除子查询。分析业务场景发现a.id不为null,那么从SQL语义出发,可以等价改写SQL为:
select count(*) from normal_date n, normal_date a where n.id = a.id group by a.id; 计划如下: QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=480.86..532.15 rows=5129 width=12) (actual time=21.539..24.356 rows=10000 loops=1) Group By Key: a.id -> Hash Join (cost=224.40..455.22 rows=5129 width=4) (actual time=6.402..13.484 rows=10000 loops=1) Hash Cond: (n.id = a.id) -> Seq Scan on normal_date n (cost=0.00..160.29 rows=5129 width=4) (actual time=0.087..1.459 rows=10000 loops=1) -> Hash (cost=160.29..160.29 rows=5129 width=4) (actual time=6.065..6.065 rows=10000 loops=1) Buckets: 32768 Batches: 1 Memory Usage: 352kB -> Seq Scan on normal_date a (cost=0.00..160.29 rows=5129 width=4) (actual time=0.046..2.738 rows=10000 loops=1) Total runtime: 26.844 ms (9 rows) |
说明:
为了保证改写的等效性,在normal_date.id加了not null约束。为了保证改写的等效性,在normal_date.id加了not null约束。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
1299次阅读
2025-04-09 15:33:27
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
530次阅读
2025-04-10 15:35:48
北京市公安局数据库大单:华为云GaussDB 1427万、金仓数据库 510万!
通讯员
236次阅读
2025-04-11 12:33:24
新疆维吾尔自治区行政事业单位数据库2025年框架协议采购(二次)入围结果公布
通讯员
116次阅读
2025-04-14 12:21:01
_通过 Navicat 连接 GaussDB 数据库实例
Gauss松鼠会
46次阅读
2025-03-20 14:52:44
GaussDB 权限管理:从 RBAC 到精细化控制的技术实践
Gauss松鼠会
45次阅读
2025-03-19 11:28:03
【GaussDB每日一贴】aclexplode函数的使用
猪踢库
44次阅读
2025-03-23 20:35:26
GaussDB 控制语句:原理、实践与性能调优
Gauss松鼠会
44次阅读
2025-03-20 14:53:41
GaussDB 数据导入导出技术指南
Gauss松鼠会
44次阅读
2025-03-20 14:41:17
GaussDB 嵌入式SQL:OPEN命令深度解析与实战指南
Gauss松鼠会
40次阅读
2025-03-28 16:35:13