当前位置: 首页 > article >正文

pg_column_size(): 眼见不一定为实

pg_column_size(): 眼见不一定为实摘要本文探讨了 PostgreSQL 的pg_column_size()函数并揭示了一个令人惊讶的行为对于以行外方式存储的 TOASTed 值该函数仅返回 18 字节的指针大小而非实际数据大小这可能导致在估算表存储需求时出现重大误差。原文链接感谢我的同事 Ozair他给我发了一张 JIRA 工单说我需要删除那个大字段有什么后果我的第一个问题是有多大就在这时候发现了这个问题。看起来很简单。确实也很简单。只需使用管理函数pg_column_size()。直到你遇到 toast 属性。这时候就有意思了。一点历史pg_column_size()由 Mark Kirkwood 在 PostgreSQL 8.1 中添加commita9236028。发布说明简单写道添加pg_column_size()(Mark Kirkwood)没什么特别的。就是一个默默工作了二十年的有用管理函数。基本用法函数签名很简单pg_column_size(any)-integer它返回存储给定值所使用的字节数。让我们从显而易见的用例开始。定长类型selectpg_column_size(1::smallint),pg_column_size(1::integer),pg_column_size(1::bigint);pg_column_size|pg_column_size|pg_column_size------------------------------------------------2|4|8不出所料。定长类型总是返回其类型大小。 ### 变长类型 sqlcreatetablet(idinteger,contenttext);insertintotvalues(1,hello);insertintotvalues(2,repeat(x,10));insertintotvalues(3,repeat(x,100));selectid,pg_column_size(content)fromt;id|pg_column_size--------------------1|62|113|101大小反映了实际内容长度加上 varlena 头。到目前为止一切正常。 ### TOAST 开始介入 当值超过 TOAST[^1] 阈值时PostgreSQL 首先尝试行内压缩。如果压缩后能放入就留在主元组中 sqlinsertintotvalues(4,repeat(x,10000));selectid,pg_column_size(content),length(content)fromtwhereid4;id|pg_column_size|length----------------------------4|125|10000用 125 字节存储 10000 个字符。值仍在主元组中已压缩。如果压缩不够PostgreSQL 将值移出行外到单独的 TOAST 表。剩下的就是一个指针总是恰好 18 字节。我尝试用重复的文本数据来演示。PostgreSQL 的压缩效果足够好以至于我无法通过这种方式触发行外存储。想一想这其实是一个特性。文档问题官方文档说显示存储任何单个数据值所使用的字节数。如果直接应用于表列则反映任何已应用的压缩。最后一句话作用很大。“任何已应用的压缩”。好的。但是 toast 属性呢文档只字未提。这很重要。源代码实际说了什么让我们看看src/backend/utils/adt/varlena.c。对于 varlena 类型pg_column_size()委托给toast_datum_size()/* varlena type, possibly toasted */resulttoast_datum_size(value);而src/backend/access/common/detoast.c中toast_datum_size()的注释明确写道返回 varlena 数据的物理存储大小可能已压缩物理存储大小。不是逻辑大小。也不是未压缩大小。对于行外存储的 toast 值主元组中剩下的是一个 TOAST 指针总是恰好 18 字节无论原始值有多大。解读聚合结果这就是陷阱闭合的地方。真正的信号是物理大小和逻辑大小之间的差距selectavg(pg_column_size(content))asphysical_avg,avg(length(content))aslogical_avgfromt;大差距意味着 TOAST 压缩在起作用。小差距意味着值确实很小或者压缩没起什么作用。 还有一点pg_column_size(NULL)返回 NULL。它是一个普通函数不是聚合函数。因此列为 NULL 的行会被静默排除在avg()之外。你的平均值只反映非 NULL 行。如果你的列有很多 NULL这个平均值比看起来的代表性要差。一定要同时检查非 NULL 比率。 ## 大表上的 TABLESAMPLE 当你在大型生产表上运行pg_column_size()进行诊断时不要对整个表运行。扫描数百万行代价很高。使用 TABLESAMPLE sql-- Bernoulli随机行级采样约 1% 的行selectavg(pg_column_size(content))asphysical_avg,avg(length(content))aslogical_avg,count(content)::float/count(*)asnon_null_ratiofromt tablesample bernoulli(1);-- System块级采样更快随机性更差约 0.1% 的块selectavg(pg_column_size(content))asphysical_avg,avg(length(content))aslogical_avg,count(content)::float/count(*)asnon_null_ratiofromt tablesample system(0.1);BERNOULLI(1)给你一个 proper 统计样本每行有 1% 的概率被选中。SYSTEM(0.1)更快因为它在块级别采样但样本不那么均匀。对于粗略的平均值两者都可以用。对于要放在报告里的东西使用BERNOULLI。补丁文档应该把这个说清楚。现在的措辞让任何处理 toast 列的人都摸不着头脑。这是为func.sgml中pg_column_size()条目提出的澄清对于变长varlena类型此函数返回物理存储大小。对于行内存储在主元组中的值这反映了实际数据大小包括任何已应用的 TOAST 压缩。对于行外存储的 toast 值这返回的是 TOAST 指针的大小18 字节而不是原始数据的大小。要获取值的逻辑大小根据类型使用length()或octet_length()。我计划将此作为文档补丁提交。如果你之前踩过这个坑或者对措辞有想法我很乐意反馈。可以在 pgsql-hackers 列表或 Bluesky 上找到我。什么是 TOASTTOASTThe Oversized-Attribute Storage Technique超大属性存储技术是 PostgreSQL 存储大值的机制。当一行超过大小阈值默认 2kB时PostgreSQL 压缩和/或移动大列值到单独的 TOAST 表只在主元组中存储一个指针。详见官方文档。

相关文章:

pg_column_size(): 眼见不一定为实

pg_column_size(): 眼见不一定为实 摘要本文探讨了 PostgreSQL 的 pg_column_size() 函数,并揭示了一个令人惊讶的行为:对于以行外方式存储的 TOASTed 值,该函数仅返回 18 字节的指针大小,而非实际数据大小,这可能导致…...

Java Iterator详解

Java Iterator详解 概述 Java的Iterator接口是Java集合框架中用于迭代(遍历)集合对象的一个接口。它提供了一种方式来遍历集合中的元素,而不需要暴露集合的内部结构。Iterator接口是Java集合框架中非常重要的一部分,它被广泛用于各种数据结构的遍历操作。 Iterator接口的…...

Git与GitHub:深入理解版本控制与代码托管

Git与GitHub:深入理解版本控制与代码托管 引言 在软件开发领域,版本控制和代码托管是至关重要的环节。Git和GitHub作为当前最流行的版本控制工具和代码托管平台,已经成为广大开发者必备的技能。本文将深入探讨Git和GitHub的基本概念、使用方法以及它们在软件开发中的重要性…...

避开Power BI数据导入的四大坑:从SQL Server连接到Excel表格的实战避坑指南

避开Power BI数据导入的四大坑:从SQL Server连接到Excel表格的实战避坑指南 当你第一次将SQL Server的销售数据与Excel的市场调研表格合并到Power BI时,那个红色感叹号就像一盆冷水浇下来——"查询超时"。这不过是数据工程师日常工作中的第一个…...

Android 4G上网协议解析:从PPP建立到数据传输全流程

1. Android 4G上网的硬件基础 当你用手机刷短视频时,有没有想过4G网络是怎么工作的?和家里WiFi不同,4G上网依赖的是基带模块这个"隐形英雄"。现代智能手机其实内置了两套网络硬件:WiFi模块用的是标准以太网卡&#xff0…...

锐捷交换机连接与故障排除实战指南

1. 锐捷交换机连接方式详解 第一次接触锐捷交换机的朋友可能会被各种连接方式搞晕,其实主要就两种场景:机房直连和远程调试。我管理过上百台锐捷设备,实测下来最稳定的还是控制台连接,不过具体用哪种方式得看现场条件。 先说说控制…...

CiteSpace 6.3.R1 从零到一:基于CNKI数据的科研图谱实战指南

1. CiteSpace入门:科研小白的知识图谱神器 第一次打开CiteSpace时,那个黑底红字的界面让我有点发怵——这玩意儿真能帮我写论文?但跟着导师操作了半小时后,我发现自己居然做出了能放进论文里的专业图谱。这款由陈超美教授开发的软…...

微信H5分享功能实战:从配置到卡片式分享的完整指南

1. 微信H5分享功能的核心原理 微信H5页面分享功能和小程序分享最大的区别在于触发方式。H5页面无法像小程序那样直接调用onShareAppMessage方法,而是需要用户主动点击右上角的菜单按钮才能触发分享。这个设计差异导致很多开发者第一次接触H5分享时会感到困惑。 微信…...

硬件加速与 OMX/Codec2:解密编解码器的底层世界

引言:那些"神秘"的 vendor 参数是怎么来的 用 MediaCodec 开发的时候,偶尔会看到这样的代码: format.setInteger("vendor.qti-ext-enc-ltr-count.num-ltr-frames", 4); format.setInteger("vendor.rtc-ext-enc-low-latency.enable", 1);这些…...

【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---HITL(Human In The Loop)南

插件化架构 v3 版本最大的变化是引入了模块化插件系统。此前版本中集成在核心包里的原生功能,现在被拆分成独立的插件。 每个插件都是一个独立的 Composer 包,包含 Swift 和 Kotlin 代码、权限清单以及原生依赖。开发者只需安装实际用到的插件&#xff0…...

绝区零自动化助手终极指南:如何实现游戏全自动一条龙服务

绝区零自动化助手终极指南:如何实现游戏全自动一条龙服务 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 还在为…...

Phi-4-Reasoning-Vision实战案例:电商商品图深度分析+隐藏线索识别

Phi-4-Reasoning-Vision实战案例:电商商品图深度分析隐藏线索识别 1. 工具介绍 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具。它专为双卡4090环境优化,能够对图片进行深度分析并识别隐藏线索&am…...

GoCodingInMyWay俜

一、什么是 Q 饱和运算? 1. 核心痛点:普通运算的 “数值回绕” 普通算术运算(如 ADD/SUB)溢出时,数值会按补码规则 “回绕”,导致结果完全错误: 示例:int8_t 类型最大值 127 1 → 结…...

Cadence 17.4 原理图分页符实战:解决‘1 of 1’报错,搞定多页连接

Cadence 17.4 原理图分页符深度解析:从报错诊断到高效设计实践 在复杂电路设计领域,Cadence 17.4作为行业标杆工具,其原理图设计功能直接影响着工程师的工作效率和设计质量。而多页原理图连接问题,尤其是分页符(off-page)配置不当…...

大模型推理硬件选型别再拍脑袋!SITS2026专家提炼的7步决策法(含量化评分卡+国产替代适配度评估表)

第一章:SITS2026专家:大模型推理加速硬件选型 2026奇点智能技术大会(https://ml-summit.org) 大模型推理对硬件的吞吐、延迟、显存带宽与能效比提出严苛要求。SITS2026专家团队基于千余次真实场景基准测试(包括Llama-3-70B、Qwen2-57B、Phi-…...

ROS机器人开发避坑指南:搞定PC、树莓派与STM32的三角通信(含完整代码与配置)

ROS多设备通信实战:PC、树莓派与STM32的高效协同架构设计 在机器人开发领域,ROS(Robot Operating System)已成为事实上的标准框架。但当我们需要将不同架构的计算设备(如x86的PC、ARM的树莓派和嵌入式STM32&#xff09…...

深入解析AXI VDMA:视频流高效传输的关键技术

1. AXI VDMA:视频处理的"高速公路收费站" 想象一下早晚高峰的城市环线,成千上万辆汽车需要有序通过收费站。AXI VDMA(Video Direct Memory Access)在视频处理系统中扮演的角色,就像这个智能收费站系统——它…...

从POC到千万级调用量:大模型灰度发布必须跨过的4道生死关(含真实故障复盘数据)

第一章:从POC到千万级调用量:大模型灰度发布必须跨过的4道生死关(含真实故障复盘数据) 2026奇点智能技术大会(https://ml-summit.org) 大模型服务在灰度发布过程中,常因流量突变、依赖耦合、推理不一致与可观测盲区而…...

在超大数据集下 DuckDB 与 MySQL 查询速度对比迂

一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...

聊一聊 C# 中的闭包陷阱:foreach 循环的坑你还记得吗?戳

. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...

三大模块深度解析:让Mac鼠标滚动体验媲美触控板的Mos工具

三大模块深度解析:让Mac鼠标滚动体验媲美触控板的Mos工具 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction independentl…...

5步彻底解决BrushNet配置优化与ComfyUI模型加载故障排除

5步彻底解决BrushNet配置优化与ComfyUI模型加载故障排除 【免费下载链接】ComfyUI-BrushNet ComfyUI BrushNet nodes 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BrushNet 在AI图像修复ాలు中,## BrushాలుNet配置## 是## 影响ాలు 工作流程…...

终极网盘直链下载助手:八大平台一键获取真实链接,告别限速烦恼

终极网盘直链下载助手:八大平台一键获取真实链接,告别限速烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / …...

从Simulink到LabVIEW:VeriStand联合仿真中人机交互界面的高效构建与数据联动

1. VeriStand联合仿真基础架构解析 当我们需要将Simulink的算法模型与LabVIEW的人机界面进行深度整合时,VeriStand就像一位专业的翻译官。这个实时测试与仿真平台能够把不同软件的语言"翻译"成彼此都能理解的形式。我去年参与的新能源汽车电控项目就采用了…...

cv_unet_image-colorization跨平台部署:Windows与Linux性能对比

cv_unet_image-colorization跨平台部署:Windows与Linux性能对比 1. 环境准备与快速部署 想要让黑白照片变彩色,cv_unet_image-colorization是个不错的选择。不过在开始之前,得先准备好运行环境。Windows和Linux系统在部署时有些不同&#x…...

Web Scraper插件实战:从乱序爬取到精准数据抓取的五大技巧

1. 为什么你的爬取数据总是乱序? 第一次用Web Scraper插件爬豆瓣电影Top250时,我也遇到过数据错位的尴尬情况。明明页面上《肖申克的救赎》对应着"希望让人自由"的经典台词,导出的CSV里却变成了《霸王别姬》的剧情简介。这种张冠李…...

深入解析M.2 B Key接口在5G模块与(U)SIM卡电路设计中的关键应用

1. M.2 B Key接口与5G模块的完美结合 第一次接触M.2 B Key接口时,我完全被它的小巧和多功能性震惊了。这个看起来像迷你版SSD插槽的接口,竟然能承载5G模块这么复杂的通信功能。在实际项目中,我发现M.2 B Key接口特别适合嵌入式设备使用&#…...

SAC算法实战:用PyTorch手把手实现Soft Actor-Critic(附完整代码)

SAC算法实战:用PyTorch手把手实现Soft Actor-Critic(附完整代码) 强化学习领域近年来最令人兴奋的进展之一,莫过于Soft Actor-Critic(SAC)算法的崛起。这个融合了最大熵原理与离线策略学习的算法&#xff0…...

STM32 NVIC优先级设置详解:以红外传感器计数为例

STM32 NVIC优先级设置详解:以红外传感器计数为例 在嵌入式系统开发中,中断管理是确保实时响应和系统稳定性的核心机制。STM32微控制器凭借其强大的NVIC(嵌套向量中断控制器)为开发者提供了灵活的中断优先级配置方案。本文将以红外…...

打造沉浸式智能AI问答助手:Vue + UniApp 全端实战(支持 Markdown/公式/多模态交互)竿

OCP原则 ocp指开闭原则,对扩展开放,对修改关闭。是七大原则中最基本的一个原则。 依赖倒置原则(DIP) 什么是依赖倒置原则 核心是面向接口编程、面向抽象编程, 不是面向具体编程。 依赖倒置原则的目的 降低耦合度&#…...