讲师中心 微信公众号
AI工具推荐 视频效率加速

如何优化PostgreSQL窗口函数的排序性能_Work_mem参数调节

阿浩姑娘_2439

阿浩姑娘_2439

发布时间:2026-05-13 07:36:20

|

576人浏览过

|

来源于php中文网

原创

窗口函数慢大概率是work_mem不足,因其分区排序依赖work_mem,超限会落盘导致性能骤降;应通过EXPLAIN或pg_stat_progress_sort确认落盘,再按需调大work_mem。

如何优化postgresql窗口函数的排序性能_work_mem参数调节

窗口函数慢,大概率是 work_mem 不够用

PostgreSQL 窗口函数(如 ROW_NUMBER()、RANK()、SUM() OVER (PARTITION BY ... ORDER BY ...))执行时,内部必须对每个 PARTITION BY 分区做排序。这个排序走的就是 work_mem 控制的内存路径——一旦数据量超过 work_mem 阈值,就会触发 external merge Disk,性能断崖式下跌。

别急着重写 SQL 或加索引。先确认是不是内存瓶颈:运行 EXPLAIN (ANALYZE, BUFFERS),重点看执行计划里有没有 WindowAgg 或 Sort 节点带 Sort Method: external merge Disk;或者查 pg_stat_progress_sort.sort_bytes 是否远超当前 work_mem 设置值。

  • 只要看到 Disk 字样或 sort_bytes > work_mem,就说明窗口排序已落盘,调大 work_mem 是最直接有效的解法
  • 注意:窗口函数的排序和 GROUP BY 的哈希聚合不同,它不走 HashAggregate,所以 pg_stat_progress_hash 对它无效
  • 如果分区数多(比如 PARTITION BY user_id 有上万不同值),每个分区都要独立排序,内存压力是乘数级的

怎么设 work_mem 才不翻车

work_mem 不是越大越好,尤其对窗口函数这种可能触发多路并行排序的操作。一个含 ORDER BY + 多个窗口函数的查询,可能同时启动 3–5 个独立排序操作,每份都吃掉一份 work_mem。

  • 起始建议从 SET LOCAL work_mem = '16MB' 开始测;若仍落盘,逐步试 '32MB'、'64MB'
  • 超过 '128MB' 要谨慎:单条查询理论峰值内存 ≈ 排序路数 × work_mem,并发 10 个这类查询就可能吃掉 1GB+ 物理内存,触发 swap
  • 估算下限可参考:假设单个分区平均 10 万行,每行排序键 24 字节,加上指针和开销,粗略需内存 ≈ 100000 × 32 × 1.5 ≈ 4.8MB —— 这就是该分区排序的保底 work_mem
  • 别改全局 postgresql.conf:窗口函数慢通常只出现在报表类查询,全局调高会污染所有 OLTP 查询,得不偿失

在应用里安全地临时调高 work_mem

最稳妥的方式是在业务逻辑中对目标查询显式设置会话级 work_mem,事务结束自动还原,不影响其他请求。

  • 在应用代码里执行查询前加一句:BEGIN; SET LOCAL work_mem = '64MB'; SELECT ... OVER (...); COMMIT;
  • 如果用连接池(如 PgBouncer),确认它没禁用 SET 命令——某些池子默认过滤运行时参数修改,需配置 ignore_startup_parameters = work_mem
  • 避免在函数体内用 SET LOCAL 影响调用者事务;若必须封装,函数需声明为 VOLATILE 并显式开启事务
  • 不要用 SET work_mem = '64MB'(无 LOCAL):它会污染整个会话,后续任意查询都继承该值,风险不可控

别碰 shared_buffers 和 effective_cache_size 来“救”窗口函数

这两个参数和窗口函数的排序性能完全无关:shared_buffers 缓存的是数据页,effective_cache_size 只影响优化器选执行计划,它们都不参与窗口函数的中间排序过程。

真正在窗口函数里起作用的只有 work_mem。调错地方不仅白忙活,还可能干扰缓存命中率(比如盲目加大 shared_buffers 挤占系统可用内存,反而让 work_mem 更容易触发 swap)。

复杂点在于:窗口函数的排序开销是隐式的、分散的,不像 ORDER BY 那么直观;容易被误判成“SQL 写得差”或“缺索引”,其实只是内存没给够。

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4789

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

647

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1396

2023.11.20

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

480

2026.02.12

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

150

2026.05.08

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

901

2026.05.08

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

244

2026.05.08

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn