news 2026/6/14 11:55:50

一个postgresql奇怪慢查询现象的原因和解决

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个postgresql奇怪慢查询现象的原因和解决

有一个复杂的CTE查询,原来最后一步直接查询的语句如下

selectt.rn,sfrom(selectrn,s,row_number()over(partitionbyrnorderbyrn)resnfromtwheret.next_pos=0)t,bWHEREresn=1andt.rn=b.rn;...Time:1357.870ms(00:01.358)

想统计最终结果中表t的行数,而不是关联后的行数,于是用下面的查询

selectcount(*)fromtwheret.next_pos=0;-- 2.754秒count-------2843(1row)Time:2754.143ms(00:02.754)

开始以为是row_number()函数过滤的影响,结果并不是,还是比较慢

selectcount(*)from(selectrn,s,row_number()over(partitionbyrnorderbyrn)resnfromtwheret.next_pos=0)t1WHEREresn=1;--2.855秒count-------1000(1row)Time:2855.320ms(00:02.855)

而原来未加count( *)的直接查询只要一半的时间。奇怪的是,对加了表连接的结果再count( *)反而更快,

selectcount(*)from(selectrn,s,row_number()over(partitionbyrnorderbyrn)resnfromtwheret.next_pos=0)t1,bWHEREresn=1andt1.rn=b.rn;--1.239秒count-------1000(1row)Time:1239.115ms(00:01.239)

查看执行计划,慢查询里有一处耗时的操作它的关联条件很长。

Nested Loop (cost=0.00..20184.70 rows=1550 width=142) (actual time=0.038..1595.842 rows=45778.00 loops=1) Join Filter: (substr(CASE CASE WHEN (length(replace(substr(replace(replace((s.b)::text, ' '::text, ''::text), ' '::text, ''::text), hh), '?'::text, ''::text)) > length(replace(substr(replace(replace((s.b)::text, ' '::text, ''::text), ' '::text, ''::text), ss), '?'::text, ''::text))) THEN 0 ELSE 1 END WHEN 0 THEN replace(replace((s.b)::text, ' '::text, ''::text), ' '::text, ''::text) ELSE reverse(replace(replace((s.b)::text, ' '::text, ''::text), ' '::text, ''::text)) END, all_pos.pos, 1) = (all_pos.n)::text)

更快的语句执行计划同样的地方就只有(substr(b_1.b, all_pos.pos, 1) = (all_pos.n)::text)。成本也只有一半

-> Nested Loop (cost=0.00..9316.20 rows=1550 width=84) (actual time=0.006..183.893 rows=45778.00 loops=1) Join Filter: (substr(b_1.b, all_pos.pos, 1) = (all_pos.n)::text)

而上述过滤条件是在另两个子查询中

aas(selectrn,replace(replace(b,chr(10),''),' ','')bfroms,bas(selectrn,caseflagwhen0thenbelsereverse(b)endb,flagfrom(selectrn,b,casewhenlength(replace(substr(b,hh),'?',''))>length(replace(substr(b,ss),'?',''))then0else1endflagfroma)s),

看来这几个子查询都没有实体化,而是展开到了 Nested Loop连接的句子中
给子查询b 加了个MATERIALIZED,变成b as MATERIALIZED (select rn,case flag when ..., 所有的count就都快了。

selectcount(*)fromtwheret.next_pos=0;count-------2843(1row)Time:1249.923ms(00:01.250)selectcount(*)from(selectrn,s,row_number()over(partitionbyrnorderbyrn)resnfromtwheret.next_pos=0)t1WHEREresn=1;count-------1000(1row)Time:1218.167ms(00:01.218)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 2:43:34

大模型时代,为何TensorFlow仍是企业的首选框架?

大模型时代,为何TensorFlow仍是企业的首选框架? 在AI技术狂飙突进的今天,大模型动辄千亿参数、万卡集群训练已成常态。学术圈里,PyTorch几乎成了“新论文标配”;开发者社区中,“动态图真香”的声音此起彼伏…

作者头像 李华
网站建设 2026/6/14 1:36:12

生成式AI重构测试自动化体系的五大维度

一、范式颠覆:从规则驱动到意图驱动 1.1 传统自动化测试的瓶颈 脚本维护成本占比超60%(ISTQB 2024报告) 动态UI元素适配难题导致30%用例失效(Gartner 2025) 复杂业务场景覆盖不足(金融业仅达42%&#xf…

作者头像 李华
网站建设 2026/6/12 22:25:57

基于Spring Boot的高校创新创业系统

基于Spring Boot的高校创新创业系统是一种专为高校创新创业项目设计的管理系统,它结合了Spring Boot框架的高效开发特性和其他相关技术,为高校创新创业项目提供了全面、高效的管理解决方案。以下是对该系统的详细介绍: 一、技术栈 前端&#…

作者头像 李华
网站建设 2026/6/14 22:46:58

基于Vue的儿童线上学习系统的设计与实现1v9lt(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末

系统程序文件列表系统功能用户,课程信息,课程类型,申请预约,课程订单,收费课程开题报告内容基于Vue的儿童线上学习系统的设计与实现开题报告一、选题背景与意义1.1 研究背景在数字化时代背景下,互联网技术深度渗透至教育领域,线上学习已成为教育模式创新…

作者头像 李华
网站建设 2026/6/13 17:36:04

基于Spring Boot医院质控上报系统

基于Spring Boot医院质控上报系统的介绍 一、系统定位与目标 基于Spring Boot的医院质控上报系统是一款专为提升医疗质量管理水平而设计的综合性信息管理平台。该系统旨在通过信息化手段,实现医院质量控制的标准化、流程化和自动化管理,帮助医院实时监控…

作者头像 李华