顺序索引的填充因子为 PK

2023-12-01

Yes, fillfactor再次。我花了很多时间阅读,但无法决定哪种方案最适合每种情况。我不明白碎片何时以及如何发生。我正在将数据库从 MS SQL Server 迁移到 PostgreSQL 9.2。

Case 1

在顺序(串行)PK 中每分钟 10-50 次插入,每小时 20-50 次读取。

CREATE TABLE dev_transactions (
  transaction_id serial NOT NULL,
  transaction_type smallint NOT NULL,
  moment timestamp without time zone NOT NULL,
  gateway integer NOT NULL,
  device integer NOT NULL,
  controler smallint NOT NULL,
  token integer,
  et_mode character(1),
  status smallint NOT NULL,
  CONSTRAINT pk_dev_transactions PRIMARY KEY (transaction_id)
);

Case 2

类似的结构,串行 PK 索引,每 2 个月写入约 50.000 个寄存器的块(一次),读数 10-50/分钟。

50% 填充因子是否意味着每次插入都会生成一个新页面并将 50% 的现有行移动到新生成的页面?

50% 填充因子是否意味着分配了可用空间between新数据页中的物理行?

仅当现有页面没有剩余空间时才会生成新页面?

正如你所看到的,我很困惑;我希望得到一些帮助——也许是阅读有关 PostgreSQL 和索引的好链接fillfactor.


FILLFACTOR

仅与INSERT and SELECT你应该使用FILLFACTOR of 100 for tables(无论如何这是默认的)。如果您不打算“摆动”,则为每个数据页留出摆动空间是没有意义的UPDATEs.

背后的机制FILLFACTOR很简单。INSERT仅填充数据页(通常是 8 kB 块),最多达到声明的百分比FILLFACTOR环境。另外,每当你跑步时VACUUM FULL or CLUSTER在桌子上,每个块都重新建立了相同的回旋空间。理想情况下,这允许UPDATE在同一数据页中存储新的行版本,这可以在处理大量数据时提供显着的性能提升UPDATEs。结合使用也有好处热的。更新. See:

  • update语句中的冗余数据

Indexes设计上需要更多的回旋余地。他们必须将新条目存储在叶页中的正确位置。一旦页面满了,就需要进行成本相对较高的“页面拆分”。因此索引往往比表更膨胀。默认FILLFACTOR对于(默认)B-Tree 索引是90(因索引类型而异)。回旋空间对于插入也有意义。最好的策略在很大程度上取决于写入模式。

示例:如果新刀片的价值稳定增长(典型情况serial or timestamp列),那么基本上没有分页,你可能会选择FILLFACTOR = 100(或者稍微低一点以允许some noise).
对于新值的随机分布,您可能会低于默认的 90 ...

基本信息来源:手册CREATE TABLE and CREATE INDEX.

其他优化

但你可以做别的东西- 因为你似乎很喜欢优化......:)

CREATE TABLE dev_transactions(
  transaction_id   serial PRIMARY KEY
, gateway          integer NOT NULL
, moment           timestamp NOT NULL
, device           integer NOT NULL
, transaction_type smallint NOT NULL
, status           smallint NOT NULL
, controller       smallint NOT NULL
, token            integer
, et_mode          character(1)
);

这可以优化您的表格数据对齐并避免padding对于典型的 64 位服务器来说,可以节省一些字节,平均可能只有 8 个字节 - 通常你不能用“列俄罗斯方块”挤出太多:

  • PostgreSQL 中的计算和节省空间

Keep NOT NULL表开头的列可以获得非常小的性能奖励。

你的桌子有9 列。初始(“无成本”)1 字节 NULL 位图覆盖8 列。第 9 列触发额外的8 bytes对于延长的空位图- 行中是否有任何 NULL 值。

如果你做et_mode and token NOT NULL,所有列都是NOT NULL并且没有 NULL 位图,每行释放 8 个字节。
如果某些列可以为 NULL,这甚至对每行都有效。如果同一行的所有字段都有值,则该行没有 NULL 位图。在您的特殊情况下,这会导致填写值的悖论et_mode and token可以让你的存储大小smaller或者至少保持不变:

  • 可为 null 的列会占用 PostgreSQL 中的额外空间吗?

基本信息来源:手册数据库物理存储.

将行的大小(填充值)与原始表进行比较以获得明确的证据:

SELECT pg_column_size(t) FROM dev_transactions t;

(另外,行之间可能会有填充,因为下一行以 8 字节的倍数开始。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

顺序索引的填充因子为 PK 的相关文章

  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 如何将压缩文件导入 Postgres 表

    我想将一个文件重要到我的 Postgresql 系统 特别是 RedShift 中 我发现了一个允许导入 gzip 文件的副本的争论 但我尝试包含在系统中的数据提供者仅生成 zip 格式的数据 有内置的 postgres 命令用于打开 zi
  • wal_keep_segments 为什么是最小值而不是最大值?

    根据docs http www postgresql org docs current static runtime config replication html wal keep segments integer 指定过去日志的最小数量
  • 单独的逗号分隔值并存储在sql server的表中

    我有一个存储过程 它将逗号分隔的值作为输入 我需要将其分开并需要将其作为单独的行存储在表中 令 SP 的输入为 Rule ID ListType ID Values 1 2 319 400 521 8465 2013 我需要将它存储在一个名
  • 如何 md5 所有列(无论类型如何)

    我想创建一个 sql 查询 或 plpgsql 它将 md5 所有给定的行 无论类型如何 但是 在下面 如果 1 为空 则哈希为空 UPDATE thetable SET hash md5 accountid accounttype cre
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • 内连接不重复,可以吗?

    鉴于这两个表 表 A1 有两行具有相同的值 a A1 a a 表 A2 有两行主键值为 A B 它们与 a 关联 A2 PK col2 A a B a 我想要的是 A1 和 A2 的连接并得到这个结果 a A a B 显然内连接在这里不起作
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 月份增量查询

    我想通过添加 1 个月来更新数据库中的月份 但我不知道如何在以下存储过程查询中添加月份 我不擅长 sql 请检查它 ALTER PROCEDURE dbo ChangePassword password varchar 20 epasswo
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation
  • SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

    也CHAR CHARACTER and VARCHAR CHARACTER VARYING SQL 提供了NCHAR NATIONAL CHARACTER and NVARCHAR NATIONAL CHARACTER VARYING 类型
  • 无法连接到数据库 - Postgres Job Scheduling 发布(基于 Windows 的计算机)

    我在互联网上搜索这个问题 但找不到正确的答案 这link https stackoverflow com questions 35410829 postgresql9 4 scheduling agent pgagent couldnt g
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤

随机推荐

  • mod_security:允许没有请求正文的 POST 请求的规则

    我安装了 Apache 2 4 和 mod security 2 9 1 它正在工作 有一些非常基本的规则 我正在尝试发出一个包含一些标头信息的 POST 请求 但请求正文中没有任何内容 该请求是发送给受 mod security 保护的
  • subscribe 的作用是什么?它与 Observable 有何关系?

    我是 Angular 的新手 我遵循的教程有术语 Observable 导师解释了 但我没有完全理解 什么是Observable 以及为什么我们总是要打电话observable subscribe 什么是subscribe 实际上呢 什么是
  • 使用 .NET“异步”API 防止 TIME_WAIT

    我有一个问题 我开发了一个客户端和服务器包装器供我个人使用 但不幸的是由于网络编程知识不足 我在客户端连接期间遇到了 TIME WAIT 问题 我的客户端现在尝试在短时间内与同一主机建立多个连接 我发现其主要原因是因为我试图重用套接字 并且
  • NASM 引导加载程序中的 jmp $

    我试图编写引导加载程序引导装载程序 写的代码是 BITS 16 start mov ax 07C0h Set up 4K stack space after this bootloader add ax 288 4096 512 16 by
  • 在 ASP.NET 应用程序中实现多语言的最佳方式

    多语言应用程序中预计会发生以下事情 行为 为登录用户的语言选择正确的资源 字符串排序应根据用户语言进行 例如 对于瑞典用户 瑞典字母应按顺序排在 z 之后 日期时间格式验证应根据用户的语言进行 例如 fr FR 用户可以输入 dd mm y
  • 有没有办法将数组传递给 python 泛型?

    我正在做一些元编程 我需要一种方法来动态定义类型提示 有没有办法将参数数组传递给类型提示 就像是 Some programatically generated list where I don t know the content unti
  • 函数指针、闭包和 Lambda

    我现在刚刚学习函数指针 当我阅读有关该主题的 K R 章节时 我首先想到的是 嘿 这有点像闭包 我知道这个假设在某种程度上从根本上是错误的 在网上搜索后我没有找到任何对此比较的分析 那么为什么 C 风格的函数指针与闭包或 lambda 有根
  • 为什么“gem”和“sudo gem”有不同的安装目录?

    我记得我用过gem install rails安装 Rails 但今天当我想安装另一个 gem 时 输入 gem install ruby recaptcha 它失败了 说 您没有写入权限 然后我找到了我的gem environment a
  • Angularjs 中的克隆元素

    我需要复制一些输入字段才能处理来自客户端的数据 我已经用 jQuery 完成了http jsfiddle net m7R3f 1 HTML fieldset div class pure g entry div class pure u 1
  • 函数中的中断和继续

    def funcA i if i 3 0 print Oh No print i break for i in range 100 funcA i print Pass print i 我知道上面的脚本行不通 那么 如果我需要将带有brea
  • Javascript window.open() 函数打开链接而不使用弹出窗口拦截器

    JavaScriptwindow open 函数打开链接而不使用弹出窗口拦截器 我想从 javascript 打开一些链接window open 功能 但在 firefox chrome safari 上被阻止 如何通过 javascrip
  • 非英语语言的推送通知

    我已经成功实现了这段代码 有谁知道如何用 C 编写 Apple 推送通知提供程序 效果很好 但我有一个问题 有人可以帮助我如何发送希伯来语或阿拉伯语等非英语消息吗 如果字符串包含任何非英文字符 则不会发送 谢谢 我找到了解决方案 长度错了
  • 在 Python 中使用 urlopen() 防止“隐藏”重定向

    我在用美丽汤对于网页抓取 我在使用时遇到特定类型网站的问题urlopen 网站上的每个项目都有自己独特的页面 并且项目有不同的格式 例如 500 毫升 1 升 2 升 当我打开产品的 URL 时 www example com produc
  • 无法使用 fetchkml 函数将本地 KMZ 文件加载到具有 google Earth 插件的浏览器中

    我们有一个 KMZ 文件 可以很好地加载到 Google 地球桌面应用程序中 没有错误 当我们尝试使用 Google Earth 插件来做同样的事情时 它甚至不会从fetchKml功能 我们需要了解使用的任何特殊设置fetchKml在本地文
  • 如何使用 Qt 创建暂停/等待函数?

    我正在玩Qt 我想在两个命令之间创建一个简单的暂停 但它似乎不会让我使用Sleep int mili 而且我找不到任何明显的等待函数 我基本上只是制作一个控制台应用程序来测试一些类代码 这些代码稍后将包含在适当的 Qt GUI 中 所以现在
  • 编译器为内在函数生成的程序集的问题

    我正在使用英特尔 SSE AVX FMA 内在函数来实现某些数学函数的完美内联 SSE AVX 指令 给出以下代码 include
  • 在 BLE 中随机化 Mac 地址

    我制作了一款将 iOS 设备变成信标的应用程序 现在 当我从 Android 设备扫描 BLE 设备时 我在扫描列表中找到了该 iOS 设备 但问题是每次我都得到随机的 Mac 地址 所以 我的问题是 这种默认行为是否意味着获取随机 mac
  • pine 脚本中 := 和 = 运算符之间的区别

    我对 TradingView Pine 脚本非常陌生 我没有找到合适的参考来理解两者之间的区别 and 运营商 有人有参考或描述吗 提前致谢 用于声明和初始化变量 用于在初始化后为变量赋值 将其转换为 可变变量 任何不可变变量 follow
  • 如何在 iPhone 中裁剪图像

    我想做同样的事情this问题 在我的应用程序中 我想像在 Facebook 中进行图像裁剪一样裁剪图像 任何人都可以通过优秀教程的链接或任何示例代码来指导我 我提供的链接将完整描述我的要求 您可以创建具有任何属性的新图像 这是我的功能 女巫
  • 顺序索引的填充因子为 PK

    Yes fillfactor再次 我花了很多时间阅读 但无法决定哪种方案最适合每种情况 我不明白碎片何时以及如何发生 我正在将数据库从 MS SQL Server 迁移到 PostgreSQL 9 2 Case 1 在顺序 串行 PK 中每