PostgreSQL 明明有索引却选了 Nested Loop:从行数误判修正执行计划
📅 2026/7/27 19:25:14
👁️ 次浏览
同一条订单查询小参数时几十毫秒大参数时却长时间占用数据库EXPLAIN显示优化器预计返回 12 行实际执行产生了十几万行随后 Nested Loop 的内表被反复扫描。问题不在于 PostgreSQL “不认识索引”而在于它基于错误的行数估计选错了连接路径。本文用一个country与currency强相关的例子说明如何找到第一次估算分叉。文中的 SQL 是可执行的诊断样例但这里没有连接你的数据库因此不会把示例结果写成实测结论。先复现两个相关条件被当成彼此独立假设订单表中中国区订单几乎都以 CNY 结算CREATETABLEorders(idbigintGENERATED ALWAYSASIDENTITYPRIMARYKEY,customer_idbigintNOTNULL,countrytextNOTNULL,currencytextNOTNULL,created_at timestamptzNOTNULL);CREATEINDEXidx_orders_customer_createdONorders(customer_id,created_atDESC);只收集单列统计信息时规划器可能分别估计country CN与currency CNY的选择率再把两者相乘。真实数据中的相关性没有进入模型中间结果便会被严重低估。在测试库中用下面的命令保留执行证据EXPLAIN(ANALYZE,BUFFERS,SETTINGS,FORMATTEXT)SELECTc.id,o.id,o.created_atFROMcustomersAScJOINordersASoONo.customer_idc.idWHEREo.countryCNANDo.currencyCNYANDo.created_atnow()-interval30 days;ANALYZE会真的执行查询不要把修改型 SQL 原样放到生产环境。排查时从计划树内层向外找第一个rows与actual rows明显分叉的节点并把loops一起看最外层耗时只是结果第一次误判才是线索。不要先禁用连接算法先检查规划器掌握了什么先查看自动分析时间和列分布SELECTrelname,last_analyze,last_autoanalyze,n_live_tupFROMpg_stat_user_tablesWHERErelnameIN(orders,customers);SELECTattname,n_distinct,most_common_vals,most_common_freqsFROMpg_statsWHEREschemanamepublicANDtablenameordersANDattnameIN(country,currency,customer_id);成功的诊断不是“强制走了 Hash Join”而是能回答三个问题统计信息是否过期、目标值是否在高频值列表中、多个过滤列是否存在业务相关性。若只是批量导入后统计信息陈旧先执行ANALYZE orders若误差稳定来自相关列再考虑扩展统计CREATESTATISTICSst_orders_country_currency(dependencies,mcv)ONcountry,currencyFROMorders;ANALYZEorders;dependencies描述列依赖mcv保存常见组合。它们帮助过滤条件估算但不会自动替代缺失的连接索引也不能修复写错的 Join 条件。做一个反事实实验而不是永久关闭 Nested Loop在事务内临时改变规划器开关可以验证“另一类计划是否值得继续调查”BEGIN;SETLOCALenable_nestloopoff;EXPLAIN(ANALYZE,BUFFERS)SELECT/* 同一条查询参数保持一致 */;ROLLBACK;这只是反事实实验。若另一计划更合适应继续修正统计信息、SQL 或索引而不是在全局配置中禁用 Nested Loop。小结果集驱动索引查找时Nested Loop 往往正是正确选择。还要防止只验证一组参数。把典型小客户、普通客户和头部客户的参数各选一组分别保存计划。预备语句使用通用计划时参数分布差异尤其容易被平均值掩盖。验收修复关注估算误差而非计划节点名称可以把计划保存为 JSON再检查目标节点的估算倍率psql$DATABASE_URL-X-vON_ERROR_STOP1-Atc\EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT c.id, o.id FROM customers c JOIN orders o ON o.customer_idc.id WHERE o.countryCN AND o.currencyCNY;\plan.json python-mjson.tool plan.json/dev/nulltest-splan.json上述命令的可验证成功条件是psql退出码为 0、plan.json非空且能被 JSON 解析。性能层面的验收还需比较修改前后相同数据快照、相同参数和相同缓存条件下的计划重点记录首次分叉节点的估算/实际行数倍率、缓冲区读取和总执行时间。失败条件包括估算误差没有缩小、只对单一参数改善或其他高频查询出现回退。优化器调优的目标不是让 SQL 永远使用某个索引而是让成本模型获得足够准确的输入。先定位第一次估错再决定更新统计、添加扩展统计、调整索引还是改写查询通常比直接改全局成本参数更可控。
文章目录2.2.1 register关键字一、register使用register修饰符的注意点2.2.2 static关键字1.1 修饰变量2.2 修饰函数2.2.1 register关键字
元素——2.2 关键字
关键字(Keywords)是C语言中具有特殊含义的保留字,它们构成了C语言语法的核心骨…
📅 2026/7/27 19:25:14
CI 截图里“保存”按钮已经出现,locator.click() 却在 30 秒后超时。继续加 waitForTimeout(5000) 有时能绿,但负载一高又失败。这个现象通常不是单纯的“页面慢”,而是元素在可见、稳定、无遮挡、可接收事件等检查中仍有一项不成立。
下面把…
📅 2026/7/27 19:25:14
如何快速搭建Logseq与Anki同步:终极使用指南 【免费下载链接】logseq-anki-sync An logseq to anki syncing plugin with superpowers - image occlusion, card direction, incremental cards, and a lot more. 项目地址: https://gitcode.com/gh_mirrors/lo/logs…
📅 2026/7/27 19:24:14
你是不是觉得,只要熬过2019年11月,生活就会突然变好?别傻了。那时候的迷茫和焦虑,像是一层洗不掉的油渍,粘在衣服上,甩都甩不掉。我到现在还记得那个深秋的晚上,我坐在出租屋的地板上,看着窗外灰蒙蒙的天,手里攥着那张被揉皱的离职信,心里全是问号:我到底做错了什么…
📅 2026/7/27 20:31:47
1. 低比特推理技术背景与挑战在深度学习模型的推理阶段,传统上使用FP32(32位浮点数)或BF16/FP16(16位浮点数)格式进行计算。但随着模型规模呈指数级增长,特别是大型语言模型(LLM)参数…
📅 2026/7/27 20:31:36
NPU的编译器开发:调试信息生成
一个让我熬夜三天的bug
凌晨两点,示波器上的波形还在跳动。我盯着屏幕上那行汇编代码,感觉血压在往上窜——NPU跑出来的结果和仿真对不上,差了一个像素值。更诡异的是,这个错误只在特定输入尺寸下复现,换张图就正常了。
我翻出编译器生成…
📅 2026/7/27 20:31:36
1. 项目概述与核心价值在嵌入式系统,尤其是对功耗和空间都极为敏感的便携式设备里,电源管理芯片(PMIC)的角色,远不止一个简单的“供电模块”。它更像是一个系统级的“能源管家”,其设计的精妙程度ÿ…
📅 2026/7/27 20:31:36
NPU的编译器开发:代码生成与汇编输出
昨晚调试到凌晨三点,盯着终端里那一串乱码般的汇编输出,我差点把咖啡泼到键盘上。问题出在NPU的MAC单元死活不肯按预期执行乘加操作——编译器生成的指令序列里,地址生成器提前了两个周期把数据喂进了流水线,结果计算单元拿到的是上一…
📅 2026/7/27 20:31:36
1. GPIO寄存器体系:从硬件抽象到软件控制的核心桥梁在嵌入式开发的日常里,GPIO(通用输入输出)是我们与外部世界交互最直接、最频繁的接口。无论是点亮一个LED,读取一个按键,还是与传感器进行简单的数字通信…
📅 2026/7/27 20:31:36
现象在 WezTerm 终端中,包含中文路径的文本(如标签页标题、Shell 提示符、路径补全)中,某些汉字时而渲染为日文字形,时而显示为简体中文(中国大陆)字形。以「径」字为例,日文写法右侧…
📅 2026/7/27 0:00:07
这个问题看似在寻找一个答案,实际上是在寻找一种“值得继续投入的方向感”。很多人在问:
“人生有什么意义?”
深层可能是在问:
我现在做的事情值得吗?我的努力有没有价值?我的存在是不是重要?未…
📅 2026/7/27 0:00:07
1. 为什么MoE架构让大模型参数量翻倍却不增加推理成本?去年我在部署一个千亿参数大语言模型时,首次接触到混合专家模型(Mixture of Experts,简称MoE)架构。当时最让我震惊的是,这种架构的模型参数量可以达到…
📅 2026/7/27 0:00:07
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/27 1:11:21
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/27 1:11:21
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/27 1:11:21
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/27 7:11:38
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/27 17:12:43
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/27 5:11:32