计算元组大小

2024-03-27

我试图了解列顺序如何最小化 PostgreSQL 中的表大小。

Example:

CREATE TABLE test (
 column_1 int
,column_2 int
,column_3 bigint
,column_4 bigint
,column_5 text
,column_6 text
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_9 timestamp
,column_10 boolean
,column_11 boolean
);

INSERT INTO test
  VALUES(1,1,1,1,'test','test_1',12,12,current_timestamp,true,false);

SELECT pg_column_size(test.*) FROM test;

 pg_column_size 
----------------
       82
    (1 row)

元组大小:

元组头的 23 字节开销 + NULL 位图的 1 字节开销,因此:

24+4+4+8+8+5+7+5+5+8+1+1=80,但实际元组大小为 82。

是否有 2 个字节的额外开销?

我理解下面链接中给出的示例:
PostgreSQL 中的计算和节省空间 https://stackoverflow.com/questions/2966524/calculating-and-saving-space-in-postgresql/7431468#7431468

如果我们删除column_8 numeric(5,2)那么元组大小也保持不变,即:82。

我已重新排序表以最小化元组大小并给出 80。

CREATE TABLE test (
 column_3 bigint
,column_4 bigint
,column_9 timestamp
,column_1 int
,column_2 int
,column_10 boolean
,column_11 boolean
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_5 text
,column_6 text);

INSERT INTO test
  VALUES(1,1,current_timestamp,1,1,true,false,12,12,'test','test_1');

SELECT pg_column_size(test) FROM test;

 pg_column_size 
----------------
      80

PostgreSQL 中的列顺序有什么建议吗?


你之前又错过了 2 个字节的填充column_9 timestamp,需要以 8 字节的倍数开始。

24+4+4+8+8+5+7+5+5+8+1+1=80 but the actual tuple size is 82.  
------------------^ <----- 2 bytes of padding here

这也是原因所在:

如果我们删除column_8 numeric(5,2)然后还有元组大小 保持不变,即:82。

取出占用 5 个字节的列后,您会在同一位置获得 7 个字节的填充 - 最坏的情况。

另请注意,该行实际上占用88 bytes在磁盘上,因为下一个元组的元组头左对齐(从多个MAXALIGN,通常为 8 个字节)。

修改后的行以 8 字节的倍数结尾,不会产生额外的填充,只需要 80 字节。

不过,两者都需要另外 4 个字节作为页眉中的元组指针。

这是一款“俄罗斯方块”游戏,您似乎已经了解其基础知识。通常你不会有太多收获,不要想太多。不过,也存在极端的极端情况。空值改变游戏规则per row.

您需要了解每种数据类型的大小、对齐和填充要求以及 NULL 位图的特殊规则。

  • 可为 null 的列会占用 PostgreSQL 中的额外空间吗? https://stackoverflow.com/questions/12145772/do-nullable-columns-occupy-additional-space-in-postgresql?lq=1

dba.SE 上详细计算的相关答案:

  • 配置 PostgreSQL 的读取性能 https://dba.stackexchange.com/a/43142/3684
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算元组大小 的相关文章

随机推荐

  • 在 TypeScript 中将变量定义为可区分联合的一种变体

    我有以下打字稿代码 它使用可区分的联合来区分一些相似的对象 interface Fish type FISH interface Bird type BIRD flyingSpeed number interface Ant type AN
  • Magento REST API 身份验证

    有没有办法从代码传递登录凭据 而不是每次在弹出窗口中输入凭据进行登录授权 您不需要每次都需要登录凭据进行授权 OAuth 成功授权后您将获得访问令牌和访问密钥 稍后使用它们进一步调用 API Oauth 协议就是这样工作的 我猜 Magen
  • PDO:使用 mysql INSERT ON DUPLICATE KEY UPDATE 检查更新或插入的记录

    使用 PDO PHP 和 MySQL 当我使用某个记录时 如何检查记录是否被插入或更新INSERT ON DUPLICATE KEY UPDATE陈述 我见过一个使用的解决方案mysql affected rows 对于 PHP 但我正在寻
  • 在循环期间使用 while mysql_fetch_array 和 UPDATE

    我正在尝试从一个表中提取数据 将列与变量进行比较 然后如果它们匹配 则添加它们并更新另一个表上的字段 看来 UPDATE 只在 while 循环内工作一次 并将该一次的值放入整个表中该列的每一行中 奇怪的是 当我回显它时 所有值都是正确的
  • 数据表导出到 Excel <选择选项>

    在我的测试页中 我插入了一个选项列表 我需要仅将所选值导出到 Excel 但现在我的 Excel 结果包括 选择选项 的所有列表 My code
  • 如何使用 PHP 解析序列化数据?

    这是我的序列化数据的示例 a 10 s 7 contact s 1 1 s 19 profile affiliation s 23 University Inc s 18 profile first name s 3 Ben s 22 pr
  • 如何在shutil.copytree中编写忽略的回调函数

    我对 python 比较陌生 我正在尝试将一个目录复制到另一个维护结构的目录 我在用 shutil copytree src dst symlinks False ignore None copy function copy2 ignore
  • 无法读取未定义的属性“executeScript”

    我按照 chrome 扩展的 入门 教程进行操作 但出现以下错误 我搜索谷歌 有人说无法访问 content js 中的 executeScript 但错误来自 popup js 我曾尝试将 chrome scripting execute
  • 如何 npm 更新 package-lock.json 中的依赖项版本?

    正如标题所示 但是 如果可能的话 我不想在 package lock json 中手动重写版本字符串 我尝试了以下方法 如何将 package json 中的每个依赖项更新到最新版本 https stackoverflow com ques
  • 无法从“const jchar *”转换为“const wchar_t *”

    这是从 cpp 文件引发的错误 我正在使用 Visual Studio 10 和 windows7 32 位 并从 Eclipse Indigo 进行编译 AUWideString JNIEnv jni jstring jstr mJni
  • 如何在 Tkinter 中悬停后更改多个小部件的颜色?

    我正在尝试制作一个脚本 它将在悬停后更改小部件的背景和前景色 from Tkinter import root Tk Hover1 Button root text Red color bg white Hover1 pack Hover2
  • WPF。是否可以进行椭圆“矩形边界”命中测试?

    是否可以在椭圆边界矩形中进行命中测试 就像这张图片上一样 http s22 postimg org 6co1y7vap image png 您可以将它们都放入 border 网格中并检查是否被单击 XAML
  • ElementListUnion - 为通用列表对象提供重复注释的简单 xml

    我正在尝试使用 elementlistunion 反序列化列表字段 Customer java ElementListUnion ElementList inline false type Thing class ElementList i
  • 如何修复:项目中未使用 Google Sheets API

    我想建立一个问卷调查线聊天机器人并将答案传输到谷歌表 这是我的代码 导入操作系统 from flask import Flask request abort from linebot import LineBotApi WebhookHan
  • TFS 2010:使用内部版本号格式的标签名称

    我正在尝试使用 TFS 2010 设置构建 我希望构建编号格式类似于 BuildDefinitionName 版本 where 版本 是在 队列构建 对话框的 获取版本 字段中指定的版本 标签或变更集 如果没有具体版本 我想要的版本是lat
  • 等轴散点图

    我有一个如下所示的数据集 DataFrame lt data frame x runif 25 y runif 25 z sample letters 1 4 25 rep TRUE 并使用 Lattice 包 我可以用以下几行绘制等轴散点
  • CKEditor 安全最佳实践

    我在用http ckeditor com http ckeditor com 在我建立的一个小型 PHP MySQL 论坛中 我的问题 将用户创建的 HTML 像这样保存在数据库中然后在我的应用程序中重新显示它是否安全 我应该采取哪些预防措
  • 文件下载 - 如何控制文件名并尊重用户的偏好?

    我的网站上有一个 blob url 和一个按钮 用户可以单击该按钮 然后 Blob 将在新选项卡中打开 a class downloadlink target blank href blobUrl a 这有效 如果用户对此 blob 后面的
  • JS中如何获取图像的DPI?

    我在 HTML5 画布上工作来计算图像上两点之间的距离 我想将以像素为单位的距离转换为厘米 我找到了一个公式 像素 2 54 DPI 所以我想知道是否可以在JS中获取DPI图像属性 或者 我可以使用最简单的方法从像素计算厘米吗 谢谢 您所要
  • 计算元组大小

    我试图了解列顺序如何最小化 PostgreSQL 中的表大小 Example CREATE TABLE test column 1 int column 2 int column 3 bigint column 4 bigint colum